+lexToken :: Parser Char TokenValue
+lexToken =
+ (lexKw "var" VarToken) <|>
+ (lexKw "Void" VoidToken) <|>
+ (lexKw "return" ReturnToken) <|>
+ (lexKw "if" IfToken) <|>
+ (lexKw "else" ElseToken) <|>
+ (lexKw "while" WhileToken) <|>
+ (lexKw "True" TrueToken) <|>
+ (lexKw "False" FalseToken) <|>
+ (lexKw "Int" IntTypeToken) <|>
+ (lexKw "Bool" BoolTypeToken) <|>
+ (lexKw "Char" CharTypeToken) <|>
+ //Escape chars
+ (liftM CharToken $ item '\'' *> item '\\' *> lexEscape <* item '\'') <|>
+ //Normal chars
+ (liftM CharToken $ item '\'' *> satisfy ((<>) '\'') <* item '\'') <|>
+ (lexOp "::" DoubleColonToken) <|>
+ (lexOp "!=" NotEqualToken) <|>
+ (lexOp "<=" LesserEqToken) <|>
+ (lexOp ">=" GreaterEqToken) <|>
+ (lexOp "==" EqualsToken) <|>
+ (lexOp "&&" AmpersandsToken) <|>
+ (lexOp "||" PipesToken) <|>
+ (lexOp "[]" EmptyListToken) <|>
+ (lexOp "->" ArrowToken) <|>
+ (lexOp "(" BraceOpenToken) <|>
+ (lexOp ")" BraceCloseToken) <|>
+ (lexOp "{" CBraceOpenToken) <|>
+ (lexOp "}" CBraceCloseToken) <|>
+ (lexOp "[" SquareOpenToken) <|>
+ (lexOp "]" SquareCloseToken) <|>
+ (lexOp "," CommaToken) <|>
+ (lexOp ":" ColonToken) <|>
+ (lexOp ";" SColonToken) <|>
+ (lexOp "." DotToken) <|>
+ (lexOp "+" PlusToken) <|>
+ (lexOp "*" StarToken) <|>
+ (lexOp "/" SlashToken) <|>
+ (lexOp "%" PercentToken) <|>
+ (lexOp "=" AssignmentToken) <|>
+ (lexOp "<" LesserToken) <|>
+ (lexOp ">" BiggerToken) <|>
+ (lexOp "!" ExclamationToken) <|>
+ (lexOp "-" DashToken) <|>
+ //Numbers
+ (liftM (NumberToken o toInt o toString) $ some $ satisfy isDigit) <|>
+ //Identifiersr
+ (liftM IdentToken $ some $ satisfy isIdentChar) <|>
+ (satisfy isSpace >>| lexToken)