3 from Data.Either import :: Either
5 :: Token :== (Int, TokenValue)
8 = IdentToken [Char] // Identifier
9 | NumberToken Int // Integer
10 | CharToken Char // Character literal
12 | VarToken // var keyword
13 | ReturnToken // return keyword
14 | IfToken // if keyword
15 | ElseToken // else keyword
16 | WhileToken // while keyword
17 | TrueToken // True keyword
18 | FalseToken // False keyword
19 | VoidToken // Void keyword
20 | IntTypeToken // Int keyword
21 | CharTypeToken // Char keyword
22 | BoolTypeToken // Bool keyword
23 //Two character tokens
24 | DoubleColonToken // ::
27 | GreaterEqToken // >=
29 | AmpersandsToken // &&
32 //One character tokens
34 | BraceCloseToken // )
35 | CBraceOpenToken // {
36 | CBraceCloseToken // }
37 | SquareOpenToken // [
38 | SquareCloseToken // ]
48 | AssignmentToken // =
51 | ExclamationToken // !
53 | EndOfFileToken // EOF
55 :: LexerOutput :== Either String [Token]
57 lexer :: [Char] -> LexerOutput