module Lexer( Token(..) , isVarToken , isNumToken , lexer -- String-> [Token] ) where import Char (isSpace, isDigit, isAlpha) data Token = TokVar String Int | TokNum Double | TokSum | TokMult | TokCount | TokIf | TokThen | TokElse | TokChar Char deriving (Eq, Show) isVarToken :: Token-> Bool isVarToken (TokVar _ _) = True isVarToken _ = False isNumToken :: Token-> Bool isNumToken (TokNum _) = True isNumToken _ = False lexer :: String-> [Token] lexer [] = [] lexer (x:xs) | isSpace x = lexer (dropWhile isSpace xs) | isDigit x = let (inum, irest) = span isDigit xs (fnum, frest) = span isDigit (tail irest) (num, rest) = if not (null irest) && head irest == '.' then (inum ++ '.': fnum, frest) else (inum, irest) in TokNum (read (x:num)): lexer rest | isAlpha x = let (id, nrest) = span isAlpha xs (num, rest) = span isDigit nrest in case x:id of "sum" -> TokSum : lexer nrest "mult" -> TokMult : lexer nrest "count" -> TokCount : lexer nrest "if" -> TokIf : lexer nrest "then" -> TokThen : lexer nrest "else" -> TokElse : lexer nrest _ -> TokVar (x:id) (if null num then 0 else read num) : lexer rest | otherwise = TokChar x : lexer xs