shaniqua-plugins/testsuite/objc/expression_parser/ArithmeticExpressionParser.hs
2005-09-03 04:45:14 +00:00

31 lines
842 B
Haskell

module ArithmeticExpressionParser where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Expr
resource :: String -> IO String
resource text = do
parsedText <- mapM parseString (lines text)
return (unlines parsedText)
parseString s = do
case (parse expr "" s) of
Left err -> return ("Error " ++ show err)
Right num -> return (show num)
expr :: Parser Integer
expr = buildExpressionParser table factor <?> "expression"
table = [ [op "*" (*) AssocLeft, op "/" div AssocLeft]
, [op "+" (+) AssocLeft, op "-" (-) AssocLeft] ]
where
op s f assoc = Infix (do { string s; return f }) assoc
factor = do { char '('; x <- expr; char ')'; return x }
<|> number
<?> "simple expression"
number :: Parser Integer
number = do { ds <- many1 digit; return (read ds) } <?> "number"