【发布时间】:2020-04-13 14:27:39
【问题描述】:
我很难在 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。我怎样才能达到这个结果?
【问题讨论】:
-
不管编程语言是什么:你永远不应该编写仅仅重复名称和/或签名已经说过的内容的 cmets。
-
@leftaroundabout 是的,我知道。那只是一个占位符,因为我正在测试并且我总是添加 cmets。其他解析器有适当的 cmets。
标签: parsing haskell arithmetic-expressions left-to-right