{- Like Expr, but using only elementary parser combinators. -} module SimpleExpr where import ParseDecorate import QTree data Expr = Add Expr Expr | Mul Expr Expr | Num Int deriving (Eq, Show, Read) pExpr :: Parser Char Expr pExpr = pSum pSum :: Parser Char Expr pSum = pMul <|> (\x _ y -> Add x y) <$> pMul <*> symbol '+' <*> pSum pMul :: Parser Char Expr pMul = pUnit <|> (\x _ y -> Mul x y) <$> pUnit <*> symbol '*' <*> pMul pUnit :: Parser Char Expr pUnit = pNum <|> (\_ x _ -> x) <$> symbol '(' <*> pExpr <*> symbol ')' pNum :: Parser Char Expr pNum = Num . read . (:[]) <$> oneOf "1234567890" oneOf :: Eq s => [s] -> Parser s s oneOf = foldl1 (<|>) . map symbol