【问题标题】:Lexing and Parsing Utilities词法分析和解析实用程序
【发布时间】:2011-06-26 07:55:28
【问题描述】:

我正在寻找不是 Flex 或 Bison 的词法分析和解析器生成实用程序。要求:

  • 使用上下文无关的 LL(*) 或 GLR 语法指定解析器。我也会考虑 PEG。
  • 与可用于脚本和应用程序开发的编程语言紧密集成。语言还应该具有与 C 轻松交互的功能。Python、Ruby 和 Guile 就是很好的例子。请不要使用 C、Java 或 Perl。我希望语言是同质的;我希望解析器生成器以相同的语言输出代码。
  • 有据可查和生产质量。
  • 开源。免费也是可取的(尽管不是必需的)。
  • 与 Linux 发行版或开源 BSD 之一兼容。我会考虑 OpenSolaris。
  • 快速开发比效率更重要。
  • 适用于解析自然语言和形式语言。自然语言解析仅限于简短、简单的句子,几乎没有歧义。

虽然我从未使用过它,但我关注的是 ANTLR。对此效果的评论表示赞赏。让我知道您最喜欢满足这些要求的实用程序是什么,以及您推荐它们的原因。

【问题讨论】:

  • 鉴于您的限制,对 flex/bison 的反对意见是什么?
  • 根据定义,每个 LALR 语法都是 LR 语法。此外,坚持使用 LR-not-LALR 解析器生成器通常会给您带来巨大的表格,而不会带来很多额外的实际好处。所以我不确定你为什么坚持(?)非 LALR 解析器生成器。如果您只关注为 Python、Ruby、Guile 生成代码,那么我理解得更好。 FWIW,我认为 ANTLR 不会产生任何这些。但我仍然感到困惑:如果您选择的语言“易于与 C 接口”(例如 Python),bison 仍然是一个不错的选择:只需使用您的语言调用 Bison 生成的 C 代码即可。
  • 我的经验是使用 Bison 和 LALR 语法,这一次不足以满足我的需求;我正在寻找一种语法更具表现力的工具。我相信规范的 LR 或 LL(*) 语法是合格的。但是,现在看来 GLR 语法可能是更好的选择。至于语言,这些解析器将作为用 C 编写的基本程序的扩展框架的一部分生成。我希望扩展语言是同质的,我不希望它是 C。ANTLR 能够生成 Python。

标签: python ruby parsing lexical-analysis guile


【解决方案1】:

有一个现代 Packrat 解析器列表here

【讨论】:

  • 我相信 OP 要求使用上下文无关语法,PEG 似乎不属于这种语法。不过,也许 OP 有可能会发现 PEG 是可以接受的。
  • 任何上下文无关的 LL(*) 或 LR 都可以用 PEG 表示,因此实际上这种差异并不重要。基于自动机的解析器生成器不能很好地满足 OP 的第二个要求,而 PEG 可以轻松集成到几乎任何语言中。
【解决方案2】:

NL 文本往往有很多歧义。如果您想解析自然语言,我认为任何经典的编译器类型解析器生成器(LALR、LL [包括 ANTLR])都不会对您有太大帮助,而编译器类型解析器生成器通常根本不处理这个问题。

处理歧义的 GLR 解析器可能会有一些用处; bison 提供了这个选项。

【讨论】:

    【解决方案3】:

    Guile 2.0(大约几天后发布)有一个LALR(1) parsing library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2020-01-17
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多