module Language.Qux.Lexer (
lexer,
identifier, natural, operator, reserved, symbol, whiteSpace,
brackets, colon, comma, parens, pipes, rightArrow
) where
import Control.Monad.State
import Text.Parsec hiding (State)
import qualified Text.Parsec.Token as Token
lexer = Token.makeTokenParser quxDef
identifier = Token.identifier lexer
natural = Token.natural lexer
operator = Token.reservedOp lexer
reserved = Token.reserved lexer
symbol = Token.symbol lexer
whiteSpace = Token.whiteSpace lexer
brackets = Token.brackets lexer
colon = Token.colon lexer
comma = Token.comma lexer
parens = Token.parens lexer
pipes p = Token.lexeme lexer $ between (symbol "|") (symbol "|") p
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 = [
"!!", "|",
"*", "/", "%",
"+", "-",
"<", "<=", ">", ">=",
"==", "!="
]