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"