language-qux-0.1.0.0: src/Language/Qux/Lexer.hs
{-|
Module : Language.Qux.Lexer
Description : A Parsec lexer for the Qux language.
Copyright : (c) Henry J. Wylde, 2015
License : BSD3
Maintainer : public@hjwylde.com
A "Text.Parsec" lexer for the Qux language.
-}
module Language.Qux.Lexer (
-- * Lexer
lexer,
-- ** Language elements
identifier, natural, operator, reserved, symbol, whiteSpace,
-- ** Symbols
brackets, colon, comma, parens, pipes, rightArrow
) where
import Control.Monad.State
import Text.Parsec hiding (State)
import qualified Text.Parsec.Token as Token
-- | Lexer for the Qux language definition.
lexer = Token.makeTokenParser quxDef
-- | Lexemes an identifier matching @[a-zA-Z_][a-zA-Z_']*@.
identifier = Token.identifier lexer
-- | Lexemes a natural number (decimal, octal or hex).
natural = Token.natural lexer
-- | Lexemes a reserved operator from 'operators'.
operator = Token.reservedOp lexer
-- | Lexemes a reserved keyword from 'keywords'.
reserved = Token.reserved lexer
-- | Lexemes a symbol.
symbol = Token.symbol lexer
-- | Lexemes white space.
-- White space includes comments.
whiteSpace = Token.whiteSpace lexer
-- | @brackets p@ lexemes @p@ surrounded by @[..]@.
brackets = Token.brackets lexer
-- | Lexemes a colon, @:@.
colon = Token.colon lexer
-- | Lexemes a comma, @,@.
comma = Token.comma lexer
-- | @parens p@ lexemes @p@ surrounded by @(..)@.
parens = Token.parens lexer
-- | @pipes p@ lexemes @p@ surrounded by @|..|@.
pipes p = Token.lexeme lexer $ between (symbol "|") (symbol "|") p
-- | Lexemes a right arrow, @->@.
rightArrow = symbol "->"
quxDef :: Token.GenLanguageDef String u (State SourcePos)
quxDef = Token.LanguageDef
commentStart
commentEnd
commentLine
nestedComments
identStart
identLetter
opStart
opLetter
reservedNames
reservedOpNames
caseSensitive
where
commentStart = "/*"
commentEnd = "*/"
commentLine = "#"
nestedComments = False
identStart = letter <|> char '_'
identLetter = alphaNum <|> oneOf ['_', '\'']
opStart = oneOf []
opLetter = oneOf []
reservedNames = keywords
reservedOpNames = operators
caseSensitive = True
keywords = [
"_",
"else", "if", "return", "while",
"false", "nil", "true",
"Bool", "Int", "Nil"
]
operators = [
"!!", "|",
"*", "/", "%",
"+", "-",
"<", "<=", ">", ">=",
"==", "!="
]