module Funcons.Lexer where import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Language (emptyDef) import qualified Text.ParserCombinators.Parsec.Token as P lexer = P.makeTokenParser emptyDef { P.identStart = letter , P.identLetter = alphaNum <|> (char '-') , P.reservedNames = [ "id", "void", "newline", "depends", "forall", "type_abs", "typevar", "atom", "?", "*", "+"] , P.reservedOpNames = ["|->", "=>"] , P.commentLine = "//" } types_keywords = ["chars", "strings", "integers","meta", "atoms", "bounded-integers", "computation-types", "empty-type", "unicode-characters", "maps", "types", "algebraic-datatypes", "bits", "ieee-floats", "lists", "sets", "multisets", "vectors", "naturals", "rationals", "thunks", "tuples", "ascii-characters", "values", "unknown"] parens = P.parens lexer brackets = P.brackets lexer braces = P.braces lexer identifier = P.identifier lexer natural = P.natural lexer reserved = P.reserved lexer reservedOp = P.reservedOp lexer comma = P.comma lexer stringLiteral = P.stringLiteral lexer period = P.dot lexer commaSep = P.commaSep lexer commaSep1 = P.commaSep1 lexer whiteSpace = P.whiteSpace lexer bar = whiteSpace *> char '|' <* whiteSpace doubleArrow = whiteSpace *> reservedOp "=>" <* whiteSpace barredArrow = whiteSpace *> reservedOp "|->" <* whiteSpace barSep2 p = (:) <$> p <* bar <*> sepBy1 p bar