Scala parser combinators vs ANTLR/Java生成的解析器?

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

安特洛专业人士

  1. 有名
  2. 外部 DSL
  3. ANTLRWorks(用于解析器语法调试/测试的出色IDE)

蚂蚁龙缺点

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

解析器组合器优点

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

解析器组合器缺点

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

有什么想法吗?

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


答案 1

Scala的解析器组合器不是很高效。它们不是被设计成这样的。它们适用于以相对较小的输入执行小任务。

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


答案 2

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

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


推荐