14

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

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

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

编辑:我所有的上下文无关解析尝试都失败了。出于这个原因,我不希望 ANTLR 在这里有用。

4

6 回答 6

9

我相信pyparsing是基于与 parsec 相同的原理。

于 2008-09-18T18:58:12.937 回答
6

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

于 2008-09-18T18:34:52.040 回答
5

您可能会考虑的一个选项,如果您可以使用 LL 解析器,则可以尝试ANTLR,它也可以生成 python(实际上它是 LL(*),正如他们的名字一样,* 代表它可以应对的前瞻数量和)。

于 2008-09-18T18:00:05.213 回答
2

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

对于动手示例,请考虑- 它是用 Python 和 PLY 编写的 ANSI C 解析器。它通过在解析器中填充符号表来解决经典的 C typedef - 标识符问题(使 C 的语法不区分上下文),该符号表在词法分析器中用于将符号名称解析为类型或非类型。

于 2008-09-19T18:58:07.270 回答
1

有 ANTLR,它是 LL(*),有 PyParsing,它对对象更友好,有点像 DSL,还有Parsing,它就像 OCaml 的 Menhir。

于 2008-09-18T18:02:07.673 回答
0

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

于 2008-09-18T18:08:28.470 回答