Haskell中Monadic Parse的论文中的例子

时间:2017-03-29 11:06:58

标签: parsing haskell monads

在论文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, "")]

非常感谢!!

1 个答案:

答案 0 :(得分:3)

chainl1中,您通过rest替换了对return的递归调用。

rest a = do f <- q
            b <- p
            rest (f a b)
         +++ return a