+definition module lex
+
+import Data.Either
+
+:: Token
+ //Value tokens
+ = IdentToken String // 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 // ||
+
+:: LexerOutput :== Either String [Token]
+
+lexer :: [Char] -> LexerOutput