代码之家  ›  专栏  ›  技术社区  ›  Jason Dagit

Parsc的python实现?

  •  12
  • Jason Dagit  · 技术社区  · 18 年前

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

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

    在haskell中,我将使用parsec,一个解析函数库(称为组合器)。是否有parsc的python实现?或者其他一些具有解析功能的生产质量库,这样我就可以在python中构建一个上下文敏感的解析器?

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

    6 回复  |  直到 18 年前
        1
  •  4
  •   PW.    18 年前

    如果ll解析器对您合适,您可以考虑的一个选项是 ANTLR 一次尝试,它也可以生成python(实际上它是他们命名的ll(*),*表示它可以处理的先行量)。

        2
  •  7
  •   Peter Hart Andre    18 年前

    我相信 pyparsing 基于与Parsec相同的原则。

        3
  •  4
  •   Awais Qarni Leonardo Conde    14 年前

    Pysec是另一个单元语法分析器,我不太了解它,但值得一看 here

        4
  •  1
  •   nimish    18 年前

    有antlr,它是ll(*),有pyparsing,它对对象更友好,有点像DSL,然后有 Parsing 就像奥卡姆的曼希尔。

        5
  •  1
  •   Awais Qarni Leonardo Conde    14 年前

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

    举个亲身实践的例子, consider -它是用python和ply编写的ANSIC的解析器。它通过在解析器中填充一个符号表来解决经典的C typedef标识符问题(使C的语法对上下文不敏感),解析器中使用该表来将符号名解析为类型或非类型。

        6
  •  0
  •   Joe Skora    18 年前

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