我很难在 Haskell 中定义从左到右的算术表达式解析器。到目前为止,我所做的是定义一个从右到左的解析器,遵循“G. Hutton, Programming in Haskell”一书。
-- the aexpr integer parser
aexpr_int :: Parser Int
aexpr_int = do
a1 <- aterm_int
s <- sign -- return 1 for "+" and -1 for "-"
a2 <- aexpr_int
return (a1 + (s * a2))
<|>
aterm_int
-- the aterm integer parser
aterm_int :: Parser Int
aterm_int = do
a1 <- aterm_int
char '*'
a2 <- afactor_int
return (a1 * a2);
<|>
do
a1 <- afactor_int
char '/'
a2 <- aterm_int
return (div a1 a2)
<|>
afactor_int
-- afactor_int
afactor_int :: Parser Int
afactor_int = do
token (char '(')
e <- aexpr_int
token (char ')')
return e
<|>
do
s <- sign
ic <- aexpr_int
return (s * ic)
<|>
token int_const
所以这解析1 - 2 - 3 - 4
为1 - (2 - (3 - 4))
,但我希望它解析为((1 - 2) - 3) - 4
。我怎样才能达到这个结果?