10

我目前正在寻找从 BNF 语法(ocamlyacc具有优先级和关联性的文件)生成 Scala 代码的词法分析器/解析器。我很困惑,因为我几乎没有发现如何去做。

对于解析,我发现scala-bison(我有很多麻烦)。所有其他工具都只是导入到 Scala 中的 Java 解析器(如ANTLR)。

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

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

所以我有两个主要问题:

  • 为什么人们似乎只专注于 _parser 组合器?
  • 与 Scala 一起使用的最佳词法分析器/解析器生成器建议是什么?
4

3 回答 3

8

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

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

于 2010-06-22T16:54:21.553 回答
3

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

Packrat Parsing 是一种用于实现回溯、递归下降解析器的技术,其优点是它保证了无限的前瞻和线性解析时间。使用这种技术,左递归文法也可以被接受。

于 2010-06-22T16:01:51.207 回答
3

我知道这个问题很老,但是对于那些仍在寻找输出 Scala 代码的词法分析器生成器的人,我编写了一个 JFlex 的分支,它发出 Scala而不是 Java,包括相应的 Maven 和 sbt 插件。所有现在都可以在 Maven Central 上使用。

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

于 2015-04-08T22:21:42.267 回答