Update examples
This commit is contained in:
@ -0,0 +1,30 @@
|
||||
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"
|
||||
|
Reference in New Issue
Block a user