module ParserExpr2 where import Parser import Char data Expr = Plus Expr Expr | Minus Expr Expr | Times Expr Expr | Div Expr Expr | Number Int | Var String deriving (Eq, Show) pExpr :: Parse Char Expr pExpr = pTerm >* token '+' >*> pExpr `use` uncurry Plus `alt` pTerm >* token '-' >*> pExpr `use` uncurry Minus `alt` pTerm pTerm :: Parse Char Expr pTerm = pFactor >* token '*' >*> pTerm `use` uncurry Times `alt` pFactor >* token '/' >*> pTerm `use` uncurry Div `alt` pFactor pFactor :: Parse Char Expr pFactor = some (spot isDigit) `use` Number. read `alt` some (spot isAlpha) `use` Var `alt` token '(' *> pExpr >* token ')' parse :: String-> Expr parse i = case filter (null. snd) (pExpr (filter (not.isSpace) i)) of [] -> error "Input does not parse." [(e, _)] -> e _ -> error "Input is ambiguous."