module Example2 where import ParserCombinators import Char data Expr = Plus Expr Expr | Times Expr Expr | Var String deriving (Eq, Show) pExpr :: Parse Char Expr pExpr = pTerm >* token '+' >*> pExpr `use2` Plus `alt` pTerm pTerm :: Parse Char Expr pTerm = pFactor >* token '*' >*> pTerm `use2` Times `alt` pFactor pFactor :: Parse Char Expr pFactor = 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."