[Haskell-beginners] Operator orders affect parse result

Norbert Melzer timmelzer at gmail.com
Mon Apr 13 08:29:12 UTC 2015


According to the given code, that result seems to be fine... Apply / to a
and be and that result is applied to * together with c. Only odd thing is
that you named the / Multiply and the * Divide.
Am 13.04.2015 09:50 schrieb "m00nlight" <dot_wangyushi at yeah.net>:

> Hi Francesco,
>
> Thanks for your reply. But after I change the aOperators like the
> following, it still produce non-correct parse result.
>
> aOperators = [ [Prefix (reservedOp "-" >> return (Neg ))]
>              , [ Infix (reservedOp "*" >> return (ABinary Divide ))
> AssocLeft,
>                  Infix (reservedOp "/" >> return (ABinary Multiply ))
> AssocLeft]
>              , [Infix (reservedOp "+" >> return (ABinary Add )) AssocLeft,
>                 Infix (reservedOp "-" >> return (ABinary Subtract ))
> AssocLeft]
>             ]
>
>
> parse result:
>
> *Main> parseString "res := a / b * c"
> Assign "res" (ABinary Divide (ABinary Multiply (Var "a") (Var "b")) (Var
> "c"))
> *Main>
>
>
>
> --m00nlight
>
> 在2015年04月13 15时21分, "Francesco Ariis"<fa-ml at ariis.it>写道:
>
>
> On Mon, Apr 13, 2015 at 02:56:47PM +0800, m00nlight wrote:
> >  Dear Haskellers,
> >
> > I have tried the "while language parser" tutorial on haskellwiki, but I
> > encounter an problem I can not understand here,
> > The following is the code:
> >
> > http://pastebin.com/saC9vwCn
> >
> >
> > So it seems that the order of the operator will affect the parse result.
> > What's the problem with my code?  How can I make my program to produce
> > consistent parse result.
>
> Checking the documentation for OperatorTable [1] (the first argument to
> buildExpressionParser), it seems it is working as expected:
>
>    An OperatorTable s u m a is a list of Operator s u m a lists. The list
>    is ordered in descending precedence. All operators in one list have
>    the same precedence (but may have a different associativity).
>
> I think you can take advantage of the fact that OperatorTable is /a list
> of lists/, hence
>
>    aOperators = [ [Prefix (reservedOp "-" >> return (Neg ))]
>                 , [Infix (reservedOp "/" >> return (ABinary Divide ))
> AssocLeft,
>                    Infix (reservedOp "*" >> return (ABinary Multiply ))
> AssocLeft]
>                 , [Infix (reservedOp "+" >> return (ABinary Add ))
> AssocLeft]
>                 , [Infix (reservedOp "-" >> return (ABinary Subtract ))
> AssocLeft]
>                 ]
>
> should do the trick (try swapping the elements in the second list.
> Will this do?
>
>
> [1]
> http://hackage.haskell.org/package/parsec-3.0.0/docs/Text-Parsec-Expr.html#t:OperatorTable
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
>
> <#14cb1c225ea1e3ea_>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150413/277ba3a7/attachment.html>


More information about the Beginners mailing list