definition module lex import Data.Either :: Token :== (Int, TokenValue) :: TokenValue //Value tokens = IdentToken [Char] // Identifier | NumberToken Int // Integer | CharToken Char // Character literal //Keyword tokens | VarToken // var 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 // } | SquareOpenToken // [ | SquareCloseToken // ] | CommaToken // , | ColonToken // : | SColonToken // ; | DotToken // . | PlusToken // + | DashToken // - | StarToken // * | SlashToken // / | PercentToken // % | AssignmentToken // = | LesserToken // < | BiggerToken // > | ExclamationToken // ! //Special tokens | EndOfFileToken // EOF :: LexerOutput :== Either String [Token] lexer :: [Char] -> LexerOutput