+
+instance toString LexerOutput where
+ toString (Left l) = "Error: " +++ l
+ toString (Right x) = 'Text'.concat (print 0 x)
+
+tab :: Int -> [String]
+tab i = replicate i "\t"
+
+print :: Int [Token] -> [String]
+print _ [] = []
+print i [(IdentToken l):rest] = [toString l:print i rest]
+print i [(NumberToken j):rest] = [toString j:print i rest]
+print i [(CharToken c):rest] = ["'":toString c:"'":print i rest]
+print i [VarToken:rest] = ["var ":print i rest]
+print i [ReturnToken:rest] = ["return ":print i rest]
+print i [IfToken:rest] = ["if":print i rest]
+print i [ElseToken:rest] = ["else ":print i rest]
+print i [WhileToken:rest] = ["while":print i rest]
+print i [TrueToken:rest] = ["True":print i rest]
+print i [FalseToken:rest] = ["False":print i rest]
+print i [VoidToken:rest] = ["Void":print i rest]
+print i [IntTypeToken:rest] = ["Int":print i rest]
+print i [CharTypeToken:rest] = ["Char":print i rest]
+print i [BoolTypeToken:rest] = ["Bool":print i rest]
+print i [DoubleColonToken:rest] = [" :: ":print i rest]
+print i [NotEqualToken:rest] = [" != ":print i rest]
+print i [LesserEqToken:rest] = [" <= ":print i rest]
+print i [GreaterEqToken:rest] = [" >= ":print i rest]
+print i [EqualsToken:rest] = [" == ":print i rest]
+print i [AmpersandsToken:rest] = [" && ":print i rest]
+print i [PipesToken:rest] = [" || ":print i rest]
+print i [ArrowToken:rest] = [" -> ":print i rest]
+print i [BraceOpenToken:rest] = ["(":print i rest]
+print i [BraceCloseToken:rest] = [")":print i rest]
+print i [CBraceOpenToken:rest] = ["{\n":tab (i+1)] ++ print (i+1) rest
+print i [CBraceCloseToken:rest] = case rest of
+ [CBraceCloseToken:_] = ["}\n":tab (i-2)] ++ print (i-1) rest
+ _ = ["}\n":tab (i-1)] ++ print (i-1) rest
+print i [SquareOpenToken:rest] = ["[":print i rest]
+print i [SquareCloseToken:rest] = ["]":print i rest]
+print i [CommaToken:rest] = [", ":print i rest]
+print i [ColonToken:rest] = [":":print i rest]
+print i [SColonToken:rest] = case rest of
+ [CBraceCloseToken:_] = [";\n":tab (i-1)] ++ print i rest
+ _ = [";\n":tab i] ++ print i rest
+print i [DotToken:rest] = [".":print i rest]
+print i [PlusToken:rest] = [" + ":print i rest]
+print i [DashToken:rest] = [" - ":print i rest]
+print i [StarToken:rest] = [" * ":print i rest]
+print i [SlashToken:rest] = [" / ":print i rest]
+print i [PercentToken:rest] = [" % ":print i rest]
+print i [AssignmentToken:rest] = [" = ":print i rest]
+print i [LesserToken:rest] = [" < ":print i rest]
+print i [BiggerToken:rest] = [" > ":print i rest]
+print i [ExclamationToken:rest] = ["!":print i rest]
+print i [EndOfFileToken:rest] = ["\n":print i rest]