【问题标题】:Lexer/parser to generate Scala code from BNF grammar词法分析器/解析器从 BNF 语法生成 Scala 代码
【发布时间】:2010-06-22 14:19:36
【问题描述】:

我目前正在寻找能够从 BNF 语法(具有优先级和关联性的 ocamlyacc 文件)生成 Scala 代码的词法分析器/解析器。我很困惑,因为我几乎一无所获。

为了解析,我找到了scala-bison(我在使用它时遇到了很多麻烦)。所有其他工具都只是导入到 Scala 中的 Java 解析器(如 ANTLR)。

对于词法分析,我一无所获。

我还找到了著名的 Scala 的 解析器组合器,但是(如果我错了,请纠正我),即使它们非常吸引人,它们也会消耗大量时间和内存,主要是由于回溯

所以我有两个主要问题:

  • 为什么人们似乎只关注 _parser 组合器?
  • 您对 Scala 的最佳词法分析器/解析器生成器建议是什么?

【问题讨论】:

    标签: scala parsing lexer parser-combinators


    【解决方案1】:

    作为 ScalaBison 论文的作者之一,我遇到过几次这个问题。 :-) 我通常在 Scala 中进行扫描时使用 JFlex。它与 ScalaBison 一起工作得非常好,我们所有的基准测试都是使用这种组合完成的。不幸的缺点是它确实会生成 Java 源代码,因此编译需要一些体操。我相信John Boyland(论文的主要作者)已经为JFlex开发了一个Scala输出模式,但我不认为它已经公开发布了。

    为了我自己的开发,我一直在研究无扫描解析技术。 Scala 2.8 的 Packrat 解析器组合器非常好,尽管还没有被推广。我已经构建了an experimental library,它在解析器组合器框架内实现了广义解析。它的渐近界比传统的解析器组合器要好得多,但实际上恒定时间开销更高(我仍在研究它)。

    【讨论】:

    • 感谢您的回答和您的 gll 组合器,我会尝试了解它是如何工作的 :) 但我想我会尝试一起使用 JFlex 和 Scala。
    • 感谢所有的教程(包括你的一些关于 codecommit 的教程)我终于设法用解析器组合器做了一个简单的词法分析器/解析器,并且没有太多的递归......再次感谢!
    【解决方案2】:

    Scala 2.8 有一个 Packrat 解析器。我在这里引用 API 文档:

    Packrat 解析是一种技术 实施回溯, 递归下降解析器,具有 它保证无限的优势 前瞻和线性解析时间。 使用这种技术,左递归 语法也可以接受。

    【讨论】:

      【解决方案3】:

      我知道这个问题已经过时了,但是对于那些仍在寻找输出 Scala 代码的词法分析器生成器的人,我编写了 a fork of JFlex that emits Scala 而不是 Java,包括相应的 Maven 和 sbt 插件。所有现在都可以在 Maven Central 上使用。

      我们目前正在使用它(包括 Maven/sbt 插件)将英文文本标记为 FACTORIE 中自然语言处理管道的一部分——包含 Scala here 的示例 .flex 文件。

      【讨论】:

      • 太好了。我已经发布了 JFlex 1.5 + scale github.com/moy/JFlex/releases 但似乎你的版本更新了,也更容易找到。
      • @JohnTangBoyland 我希望在写我的之前找到你的版本!
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 2011-01-30
      • 2023-03-19
      • 1970-01-01
      • 2010-09-15
      • 2014-01-16
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多