module SimpleLexer where import Char data Token = Number Integer | Sep Char | Ident String deriving (Show) simpleLexer :: String -> [Token] simpleLexer (c:cs) | isDigit c = lexNumber [c] cs | isAlpha c = lexIdent [c] cs | isSep c = Sep c : simpleLexer cs | isSpace c = simpleLexer cs | otherwise = error ("simpleLexer: illegal character: " ++ take 20 (c:cs)) simpleLexer [] = [] lexNumber, lexIdent :: String -> String -> [Token] lexNumber prefix (c:cs) | isDigit c = lexNumber (prefix ++ [c]) cs lexNumber prefix s = Number (read prefix) : simpleLexer s lexIdent prefix (c:cs) | isAlphaNum c = lexIdent (prefix ++ [c]) cs lexIdent prefix s = Ident prefix : simpleLexer s isSep c = c `elem` "(){};,+-*/="