可以处理歧义的解析器库



我正在寻找一个成熟的解析器库,无论是Scala还是Haskell。最重要的是,图书馆可以处理歧义。如果表达式含糊不清,我想要与表达式相匹配的所有可能的抽象语法树。简单示例:表达式 ab⊗c 可以看作是(a⊗B)⊗c a⊗(b⊗C),我需要两个变体。谢谢!

我觉得那个老家伙想起沃尔德(Walder)的论文,例如理解Monads(DO符号的前身),这是令人兴奋和新的。这个想法是您(引用)将失败替换为成功列表,这意味着要维护所有可能的解析的列表。最后,您通常只参加第一场比赛,但是有了此设置,您可以将所有比赛进行。

对于确定性解析器而言,这些并不是那么有效,这就是为什么它们不那么时尚,但它们是您所需要的。

请看一下杂质,特别是Text.ParserCombinators.HuttonMeijerText.ParserCombinators.HuttonMeijerWallace

(Hutton& Meijer将解析器库翻译成Haskell(来自Gofer),Wallace添加了额外的功能。)

请确保您在使用

的分析"aaaa"等简单案例中检查一下
testP = do
   a <- many $ char 'a'
   b <- many $ char 'a'
   return (a,b)

看看它是否具有您寻求的语义。

您要求成熟。这些图书馆是纯粹的功能编程遗产的一部分!话虽如此,即使它年轻,我也会称呼Parsec更成熟。

(猜测:我认为Parsec可以做您想做的事情。它的标准选择组合是确定性的。我没有考虑调整或替换这种行为,恐怕我不想。)

这个问题立即使我想起yacc死了/不,这不是从2010年底开始的辩论。在Scala(未受未来的),Haskell和球拍中的图书馆。在 yacc中,Russ Cox指出,该代码在指数时间内用于模棱两可的语法。

众所周知,可以在O(n^3)中解析含糊不清的语法,尽管显然可能需要花费指数时间才能列举所有解析树,因为有很多人都有许多解析。x1 + x2 + x3 ... + xnbison实现了这样做的GLR算法;不幸的是,虽然bison肯定是成熟的(如果不是实际的垂死),但它既不写在Haskell也不写于Scala。

Daniel Spiewak在Scala IIRC中实施了GLL解析器,但是上次我看了看它,它遇到了一些性能问题。因此,我不确定它是否可以描述为成熟。

我无法说出它的成熟有多成熟或给您任何用法示例,但是我已经在标签中打开了Scala Gll-Combinators库几天。它处理模棱两可的语法,看起来很漂亮。

最后,选择属于语法定义形式主义(SDF2)在此处使用SDF表生成器和JSGLR作为解析器发电机。