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

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

ANTLR专业人士

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

ANTLR缺点

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

Parser combinator专业人士

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

解析器组合器缺点

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

有什么想法吗?

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

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

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

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

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

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

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

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