<p dir="ltr">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. </p>
<div class="gmail_quote">Am 13.04.2015 09:50 schrieb "m00nlight" <<a href="mailto:dot_wangyushi@yeah.net">dot_wangyushi@yeah.net</a>>:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="color:#000;font-size:14px;font-family:arial"><div>Hi Francesco,<br><br>Thanks for your reply. But after I change the aOperators like the following, it still produce non-correct parse result.<br><br>aOperators = [ [Prefix (reservedOp "-" >> return (Neg ))]<br>             , [ Infix (reservedOp "*" >> return (ABinary Divide )) AssocLeft,<br>                 Infix (reservedOp "/" >> return (ABinary Multiply )) AssocLeft]<br>             , [Infix (reservedOp "+" >> return (ABinary Add )) AssocLeft,<br>                Infix (reservedOp "-" >> return (ABinary Subtract )) AssocLeft]<br>            ]<br><br><br>parse result:<br><br>*Main> parseString "res := a / b * c"<br>Assign "res" (ABinary Divide (ABinary Multiply (Var "a") (Var "b")) (Var "c"))<br>*Main> <br></div><div><br></div><div><br></div><div><br></div></div><div name="100"><div><div>--m00nlight<br></div></div></div><div><br></div><div>在2015年04月13 15时21分, "Francesco Ariis"<<a href="mailto:fa-ml@ariis.it" target="_blank">fa-ml@ariis.it</a>>写道:</div><blockquote style="padding-left:1ex;margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204)"><br>On Mon, Apr 13, 2015 at 02:56:47PM +0800, m00nlight wrote:<br>>  Dear Haskellers,<br>> <br>> I have tried the "while language parser" tutorial on haskellwiki, but I<br>> encounter an problem I can not understand here,<br>> The following is the code:<br>> <br>> <a href="http://pastebin.com/saC9vwCn" target="_blank">http://pastebin.com/saC9vwCn</a><br>> <br>> <br>> So it seems that the order of the operator will affect the parse result.<br>> What's the problem with my code?  How can I make my program to produce<br>> consistent parse result.<br><br>Checking the documentation for OperatorTable [1] (the first argument to<br>buildExpressionParser), it seems it is working as expected:<br><br>    An OperatorTable s u m a is a list of Operator s u m a lists. The list<br>    is ordered in descending precedence. All operators in one list have<br>    the same precedence (but may have a different associativity).<br><br>I think you can take advantage of the fact that OperatorTable is /a list<br>of lists/, hence<br><br>    aOperators = [ [Prefix (reservedOp "-" >> return (Neg ))]<br>                 , [Infix (reservedOp "/" >> return (ABinary Divide )) AssocLeft,<br>                    Infix (reservedOp "*" >> return (ABinary Multiply )) AssocLeft]<br>                 , [Infix (reservedOp "+" >> return (ABinary Add )) AssocLeft]<br>                 , [Infix (reservedOp "-" >> return (ABinary Subtract )) AssocLeft]<br>                 ]<br><br>should do the trick (try swapping the elements in the second list.<br>Will this do?<br><br><br>[1] <a href="http://hackage.haskell.org/package/parsec-3.0.0/docs/Text-Parsec-Expr.html#t:OperatorTable" target="_blank">http://hackage.haskell.org/package/parsec-3.0.0/docs/Text-Parsec-Expr.html#t:OperatorTable</a><br>_______________________________________________<br>Beginners mailing list<br><a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br></blockquote><br><br><span title="neteasefooter"><span><span title="neteasefooter"><span><a href="#14cb1c225ea1e3ea_"></a></span></span>
</span></span><br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div>