在论文Monadic Parse in Haskell中,作者给出了一个解析简单算术字符串的例子。我试图扩展term
,将其应用到"1 + 2"
,但我仍然对解析器的递归性质感到困惑。也就是说,如果我做了正确的话,term
将扩展为以下形式
expr = ((digit +++ do {symb "("; n <- expr; symb ")"; return n})
`chianl1` mulop) `chainl1` addop
但是首先在"1"
字符串"1 + 2"
和digit
"+"
之后解析数字addop
,为什么解析器{{1}继续解析expr
?
此外,当我将"2"
应用于term
时,这是本文中给出的示例,我得到了"1 - 2 * 3 + 4"
而不是[(-5,"+ 4")]
。这是我的代码的问题吗?然而,我已经在论文中检查了我的代码,发现没有任何偏差。
以下是我的代码
[(-1, "")]
非常感谢!!
答案 0 :(得分:3)
在chainl1
中,您通过rest
替换了对return
的递归调用。
rest a = do f <- q
b <- p
rest (f a b)
+++ return a