import Data.Either
-:: Token
+:: Token :== (Int, TokenValue)
+:: TokenValue
//Value tokens
- = IdentToken String // Identifier
+ = IdentToken [Char] // Identifier
| NumberToken Int // Integer
| CharToken Char // Character literal
//Keyword tokens
| VarToken // var keyword
- | VoidToken // void keyword
| ReturnToken // return keyword
| IfToken // if keyword
| ElseToken // else keyword
| WhileToken // while keyword
| TrueToken // True keyword
| FalseToken // False keyword
+ | VoidToken // Void keyword
+ | IntTypeToken // Int keyword
+ | CharTypeToken // Char keyword
+ | BoolTypeToken // Bool keyword
+ //Two character tokens
+ | DoubleColonToken // ::
+ | NotEqualToken // !=
+ | LesserEqToken // <=
+ | GreaterEqToken // >=
+ | EqualsToken // ==
+ | AmpersandsToken // &&
+ | PipesToken // ||
+ | ArrowToken // ->
//One character tokens
| BraceOpenToken // (
| BraceCloseToken // )
| CBraceOpenToken // {
- | CBraceCloseToken // {
+ | CBraceCloseToken // }
| SquareOpenToken // [
| SquareCloseToken // ]
| CommaToken // ,
| LesserToken // <
| BiggerToken // >
| ExclamationToken // !
- //Two character tokens
- | DoubleColonToken // ::
- | LesserEqToken // <=
- | GreaterEqToken // >=
- | EqualsToken // ==
- | AmpersandsToken // &&
- | PipesToken // ||
+ //Special tokens
+ | EndOfFileToken // EOF
:: LexerOutput :== Either String [Token]