Parsec的Python实现?

时间:2008-09-18 17:54:40

标签: python parsing parsec combinators

我最近使用Ply在Python中编写了一个解析器(它是yacc的python重新实现)。当我差不多完成解析器时,我发现我需要解析的语法要求我在解析过程中进行一些查找以通知词法分析器。在没有查看通知词法分析器的情况下,我无法正确解析语言中的字符串。

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

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

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

6 个答案:

答案 0 :(得分:7)

我认为pyparsing基于与parsec相同的原则。

答案 1 :(得分:4)

你可以考虑的一个选项,如果一个LL解析器对你好,就是试试ANTLR,它也可以生成python(实际上它是LL(*),因为它们命名,*代表它可以应付的前瞻量。)

答案 2 :(得分:4)

PySec是另一个monadic解析器,我不太了解它,但值得关注here

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

对于动手示例,consider - 它是使用PLY用Python编写的ANSI C的解析器。它解决了经典的C typedef - identifier问题(这使得C的语法非上下文敏感),通过在词法分析器中使用的解析器中填充符号表来解析符号名称是否为类型。

答案 5 :(得分:0)

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