我最近使用 Ply 用 Python 编写了一个解析器(它是 yacc 的 python 重新实现)。当我几乎完成解析器时,我发现我需要解析的语法要求我在解析期间进行一些查找以通知词法分析器。如果不进行查找来通知词法分析器,我就无法正确解析该语言中的字符串。

鉴于我可以根据语法规则控制词法分析器的状态,我想我将使用解析器模块中的查找表来解决我的用例,但它可能变得太难以维护/测试。所以我想了解一些其他选择。

在 Haskell 中,我会使用 Parsec,一个解析函数库(称为组合器)。有 Parsec 的 Python 实现吗?或者也许是其他一些具有解析功能的生产质量库,以便我可以在 Python 中构建上下文敏感的解析器?

编辑:我所有的上下文无关解析尝试都失败了。因此,我不认为 ANTLR 在这里有用。

有帮助吗?

解决方案

如果 LL 解析器适合您,您可以考虑的一个选项是给出 ANTLR 尝试一下,它也可以生成 python(实际上它是 LL(*),正如他们的名字一样,* 代表它可以处理的向前查找的数量)。

其他提示

我相信 py解析 基于与秒差距相同的原理。

PySec是另一个monadic解析器,我对它了解不多,但值得一看 这里

有 ANTLR,即 LL(*),有 PyParsing,它对对象更加友好,有点像 DSL,然后还有 解析 这就像 OCaml 的 Menhir。

没有什么可以阻止您使用 PLY 将解析器从“上下文无关”路径转移。您可以在解析过程中将信息传递给词法分析器,从而实现充分的灵活性。我很确定你可以用 PLY 这种方式解析任何你想要的东西。

举个实际的例子, 考虑 - 它是一个用 Python 和 PLY 编写的 ANSI C 解析器。它通过在解析器中填充符号表来解决经典的 C typedef - 标识符问题(这使得 C 的语法不上下文相关),该符号表在词法分析器中用于将符号名称解析为类型或非类型。

ANTLR 很棒,而且还有跨多种语言工作的额外好处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top