Scala解析器组合器与ANTLR / Java生成的解析器?

时间:2011-05-15 20:46:47

标签: java parsing scala antlr3 parser-combinators

我正在为一个主要用Scala编写的应用程序编写表达式解析器。我在Scala中构建了AST对象,现在需要编写解析器。我听说过Scala的内置解析器组合器,以及ANTLR3,我想知道:哪个可以提供更好的性能和编写代码的简易性?到目前为止:

ANTLR专业人士

  1. 公知的
  2. 快速
  3. 外部DSL
  4. ANTLRWorks(用于解析器语法调试/测试的优秀IDE)
  5. ANTLR缺点

    1. 基于Java(Scala互操作可能具有挑战性,任何经验?)
    2. 在运行时需要较大的依赖关系
    3. Parser combinator pros

      1. Scala的一部分
      2. 少一个构建步骤
      3. 不需要运行时依赖;例如已包含在Scala的运行时库中
      4. Parser combinator cons

        1. 内部DSL(可能意味着执行速度较慢?)
        2. 没有ANTLRWorks(提供很好的解析器测试和可视化功能)
        3. 有什么想法吗?

          编辑:此表达式解析器解析代数/微积分表达式。它将在最终确定的Android应用程序Magnificalc中使用。

6 个答案:

答案 0 :(得分:16)

Scala的解析器组合器效率不高。它们的设计并非如此。它们适合做相对较小投入的小任务。

所以这真的取决于你的要求。 ANTLR不应该存在任何互操作问题。从Java调用Scala可能会变得毛茸茸,但是从Scala调用Java几乎总是有效。

答案 1 :(得分:6)

我不担心解析器组合器的性能限制,除非您计划解析几页长的代数表达式。 Programming Scala一书确实提到了解析器组合器的更高效实现是可行的。也许有人会找时间和精力来写一个。

我认为使用ANTLR你正在谈论两个额外构建步骤:ANTLR编译为Java,你需要将Scala和Java编译为字节码,而不仅仅是Scala。

答案 2 :(得分:2)

我使用ANTLRv4和Scalas解析器组合创建了外部DSL,我显然更喜欢解析器组合器,因为在设计语言时您获得了出色的编辑器支持,并且很容易将解析结果转换为任何AST情况类数据结构。开发ANTLR语法需要花费更多时间,因为即使使用ANTLRWorks编辑器支持,开发语法也非常容易出错。与解析器组合器相比,整个ANTLR工作流程对我来说非常臃肿。之一。

答案 3 :(得分:0)

我倾向于尝试使用解析器组合器生成外部 DSL。它不应该是一个内部DSL。但我不知道会更好。

解决这个问题的最佳方法是采用语法的简化版本,尝试两种方式并评估差异。

答案 4 :(得分:0)

一直在为家用Brew 8位CPU汇编器编写解析器。

我对Antlr4的了解如此之广,然后才觉得必须有更好的方法。 我决定去使用Scala解析器组合器,不得不说这是更加高效的恕我直言。但是,我确实知道scala。

答案 5 :(得分:0)

如果您仍然对整数表达式解析器感兴趣,请在此处查看我的示例解释器:https://github.com/scala-szeged/hrank-while-language .这是使用官方解析器组合器的 20000 行 Scala 代码。它有表达式解析。它还处理嵌套 if、嵌套 while、变量和布尔表达式。我还在这个 github 存储库中实现了数组处理。如果您需要处理字符串,我也可以为您提供帮助。

另一个更简单的表达式解析器也存在于我的另一个公共存储库 https://github.com/scala-szeged/top-calc-dsl