[Haskell-beginners] Operator orders affect parse result

m00nlight dot_wangyushi at yeah.net
Mon Apr 13 07:49:43 UTC 2015


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150413/66316ad0/attachment.html>


More information about the Beginners mailing list