module ExprLexer where import ParseDecorate import ParseHelper import qualified Token as T import ParseTree import Data.Maybe (fromJust) data Token = Num Int | Plus | Minus | Star | Slash | POpen | PClose | Space String deriving Eq instance Symbol Token where symbolSize = length . show spaceBeforeSize _ = 0 spaceAfterSize _ = 0 instance Show Token where showsPrec _ tok = case tok of Num n -> (show n ++) Space s -> (s ++) _ -> (fromJust (lookup tok statics) ++) statics :: [(Token, String)] statics = [ (Plus, "+") , (Minus, "-") , (Star, "*") , (Slash, "/") , (POpen, "(") , (PClose, ")") ] pStaticToken :: Parser Char Token w pStaticToken = choice $ map (\(tok, syn) -> const tok <$> token syn) statics pSpace :: Parser Char Token w pSpace = Space <$> many1 (oneOf " \n\r\t\f") isSpace :: Token -> Bool isSpace (Space _) = True isSpace _ = False isNum :: Token -> Bool isNum (Num _) = True isNum _ = False pToken :: Parser Char Token w pToken = pStaticToken <|> Num <$> pInt <|> pSpace pInt :: Parser Char Int w pInt = (\d ds -> read (d:ds)) <$> oneOf ['1'..'9'] <*> many (oneOf ['0'..'9']) pTokens :: Parser Char [T.Token Token] w pTokens = T.collapse isSpace <$> many pToken