Python的Parsec实现?
我最近使用Ply在Python中编写了一个解析器(这是yacc的python重新实现)。当我几乎完成解析器的工作后,我发现需要解析的语法要求我在解析过程中进行一些查找以告知词法分析器。如果不进行查询以通知词法分析器,就无法正确解析该语言中的字符串。
考虑到我可以通过语法规则控制词法分析器的状态,我认为我将使用解析器模块中的查找表来解决用例,但是维护/测试可能变得太困难了。因此,我想了解其他一些选项。
在Haskell中,我将使用Parsec,一个解析函数库(称为组合器)。有Parsec的Python实现吗?还是其他一些具有解析功能的生产质量库,以便我可以在Python中构建上下文相关的解析器?
编辑:我所有上下文无关的解析尝试都失败了。因此,我不希望ANTLR在这里有用。
解决方案
我们可以考虑的一个选择是,如果可以使用LL解析器,可以尝试一下ANTLR,它也可以生成python(实际上是LL(),因为它们命名为,*表示它可以应付的前瞻量和)。
有一个ANTLR,它是LL(*),有一个PyParsing,它对对象更友好,有点像DSL,然后有解析,就像OCaml的Menhir。
ANTLR很棒,并且具有跨多种语言工作的额外好处。
PySec是另一个monadic解析器,我对此了解不多,但是这里值得一看
我相信pyparsing是基于与parsec相同的原理。
没有什么可以阻止我们使用PLY将解析器从"无上下文"路径中转移出来的。我们可以在解析过程中将信息传递给词法分析器,并以此实现完全的灵活性。我很确定我们可以用PLY解析任何我们想要的东西。
作为一个动手的示例,请考虑它是使用PLY用Python编写的ANSI C解析器。它通过在解析器中填充符号表来解决经典的C typedef标识符问题(这使C的语法对上下文不敏感),该解析器在词法分析器中用于将符号名称解析为类型还是不解析。