Lexer / parser从BNF语法生成Scala代码

时间:2010-06-22 14:19:37

标签: scala parsing lexer parser-combinators

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

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

对于lexing,我一无所获。

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

所以我有两个主要问题:

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

3 个答案:

答案 0 :(得分:7)

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

对于我自己的开发,我一直在使用无扫描解析技术。 Scala 2.8的packrat解析器组合非常好,但仍然没有推广。我构建了an experimental library,它在解析器组合框架中实现了通用解析。它的渐近边界比传统的解析器组合更好,但实际上恒定的时间开销更高(我还在努力)。

答案 1 :(得分:3)

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

  

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

答案 2 :(得分:3)

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

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