definition module lex import Data.Either :: Token //Value tokens = 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 //One character tokens | BraceOpenToken // ( | BraceCloseToken // ) | CBraceOpenToken // { | CBraceCloseToken // { | SquareOpenToken // [ | SquareCloseToken // ] | CommaToken // , | ColonToken // : | SColonToken // ; | DotToken // . | PlusToken // + | DashToken // - | StarToken // * | SlashToken // / | PercentToken // % | AssignmentToken // = | LesserToken // < | BiggerToken // > | ExclamationToken // ! //Two character tokens | DoubleColonToken // :: | LesserEqToken // <= | GreaterEqToken // >= | EqualsToken // == | AmpersandsToken // && | PipesToken // || | ArrowToken // -> :: LexerOutput a :== Either String a lexer :: [Char] -> LexerOutput [Token]