[Haskell-beginners] Arithmetic expression parsing problem

m00nlight dot_wangyushi at yeah.net
Mon Mar 30 08:10:18 UTC 2015


Hi Francesco,

Thanks for your explaination, so how can I modify the parser to handle this case?
Can you give me some more details of how to modify it?

Thanks in advanced.







--m00nlight



在2015年03月30 15时05分, "Francesco Ariis"<fa-ml at ariis.it>写道:

On Mon, Mar 30, 2015 at 02:22:20PM +0800, m00nlight wrote:
> I am new to programming in haskell, recently I came up with an task to
> write an simple arithemtic evaluator in haskell. I try to write it using
> Text.Parsec, it can handle binary operation and some unary operation,
> but will give information of parsing error in some case. The following
> is my code
>
> [..]
> Can anyone teach me how to solve this?  Thanks in advanced.

Hello,

first things first, I slightly modified your `solution` function, so it
can fail with meaningful error messages

   solution :: (Num a, Integral a) => String -> a
   solution = either (error . show) eval . parse expr ""

Then I added to `<?>` operators at the end of your parsing expression
(again, for easier diagnostic).

   factor = between (char '(') (char ')') expr
            <|> (Num . read <$> many1 digit) <?> "factor"

   expr = buildExpressionParser table factor <?> "expr"

Now the error message is:

   λ> solution "-4/-2"
   *** Exception: (line 1, column 4):
   unexpected "-"
   expecting factor

So Parsec was expecting a "factor" element but found itself with '-'.
The first alternative of factor is not what we want (an expression
surrounded by parentheses).
The second part should be it (a 'number'). Now it is easy to recognise
the problem: `digit` only accepts digits and not '-' as a prefix.


When parsing stuff, <?>, small functions and early testing (with
hspec[1]) saved me much time and pain debugging.


[1] http://hspec.github.io/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150330/d2b3f708/attachment.html>


More information about the Beginners mailing list