module Expr2 where import Parser import Char data Expr = Plus Expr Expr | Minus Expr Expr | Times Expr Expr | Div Expr Expr | Number Int deriving (Eq, Show) pExpr :: Parse Char Expr pExpr = pTerm >* token '+' >*> pExpr `build` uncurry Plus `alt` pTerm >* token '-' >*> pExpr `build` uncurry Minus `alt` pTerm pTerm :: Parse Char Expr pTerm = pFactor >* token '*' >*> pTerm `build` uncurry Times `alt` pFactor >* token '/' >*> pTerm `build` uncurry Div `alt` pFactor pFactor :: Parse Char Expr pFactor = some (spot isDigit) `build` Number . read `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 "Ambiguous input."