Parsec的Python实现?

Parsec的Python实现?,python,parsing,parsec,combinators,Python,Parsing,Parsec,Combinators,我最近使用Ply用Python编写了一个解析器(这是yacc的Python重新实现)。当我几乎使用完解析器时,我发现需要解析的语法要求我在解析过程中进行一些查找,以通知词法分析器。如果不进行查找以通知lexer,我就无法正确解析语言中的字符串 假设我可以从语法规则控制词法器的状态,我想我将使用解析器模块中的查找表来解决我的用例,但是维护/测试可能会变得太困难。所以我想知道一些其他的选择 在Haskell中,我将使用Parsec,一个解析函数库(称为组合函数)。有Parsec的Python实现吗?

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

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

在Haskell中,我将使用Parsec,一个解析函数库(称为组合函数)。有Parsec的Python实现吗?或者是其他一些产品质量库,其中包含了解析功能,这样我就可以用Python构建上下文敏感的解析器了


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

< P>一个选项,如果一个LL解析器对你来说是一个尝试,它也可以生成Python(实际上它是L*(*),因为它命名它,*代表它可以应付的前瞻性的数量)。< /P> < P> > ANTLR,这是LL(*),PyPalsChin,它对对象更加友好,有点像DSL,还有一种类似于OCaml的Menhir。

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

PySec是另一种单元解析器,我不太了解它,但是值得一看

我相信这是基于与parsec相同的原则。

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


对于一个实际操作的例子,-它是一个用Python和PLY编写的ansic解析器。它通过在语法分析器中填充一个符号表来解决经典的C typedef-identifier问题(这使得C的语法对上下文不敏感),该语法分析器用于将符号名称解析为类型或非类型。

在我的例子中,我需要的比传统语法分析所允许的更多。由于理论上的原因,我编写传统的上下文无关解析器的所有尝试都失败了。在这一点上我相当自信,我至少需要条件词法分析。ANTLR仍然适用吗?您对ANTLR有*前瞻功能,如果需要,您可以向语法中添加语法和谓词(语义谓词也存在)。使用AntlWork,它对设计/调试语法()非常有帮助。ANTLR网站上也有现成的语法。我现在正在研究PyParsing,它看起来与我见过的Parsec最接近。我现在接受你的回答。让我们希望PyParsing能够工作:)谢谢!我关心的是在PyParsing文档中阅读这一点:对于复杂语法和/或大型输入字符串,PyParsing的性能可能会很慢。