import Parsing import Data.Char(isSpace) -- Parsing Expressions using the monadic parser ------------------------------------------------------------------------- -- The expression datatype data Expr = Num Int | Add Expr Expr | Mul Expr Expr deriving ( Show, Eq ) ------------------------------------------------------------------------- -- {- Parsed according to the grammar expr ::= term + expr | term term ::= factor * term | factor factor ::= num | (expr) -} expr, term, factor, num :: Parser Expr num = do n <- int return $ Num n expr = chain term '+' Add term = chain factor '*' Mul factor = num +++ do char '(' e <- expr char ')' return e -- reading expressions readExpr :: String -> Maybe Expr readExpr s = case parse expr s' of Just (a,"") -> Just a _ -> Nothing where s' = filter (not.isSpace) s