27

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

ANTLR 专业人士

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

ANTLR 缺点

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

解析器组合器专家

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

解析器组合器的缺点

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

有什么想法吗?

编辑:这个表达式解析器解析代数/微积分表达式。最终确定后,它将在适用于 Android 的应用 Magnificalc 中使用。

4

6 回答 6

18

Scala 的解析器组合器效率不高。他们不是被设计成的。它们适用于以相对较小的投入完成小任务。

所以这真的取决于你的要求。ANTLR 不应该有任何互操作问题。从 Java 调用 Scala 可能会很麻烦,但从 Scala 调用 Java 几乎总是可以正常工作。

于 2011-05-15T22:37:29.180 回答
6

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

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

于 2011-05-17T20:52:51.537 回答
2

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

于 2015-12-24T13:09:51.777 回答
0

I would be inclined to try to produce an external DSL using parser combinators. It shouldn't need to be an internal DSL. But I don't know that it would be better.

The best approach to figuring this out would be to take a simplified version of the grammar, try it both ways and evaluate the differences.

于 2011-05-15T21:13:18.407 回答
0

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

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

于 2021-03-31T09:27:29.733 回答
0

刚刚为自制 8 位 CPU 汇编器编写解析器。

在我觉得必须有更好的方法之前,我在 Antlr4 上走了这么远。我决定尝试一下 Scala 解析器组合器,我不得不说它的效率更高,恕我直言。但是,我确实知道斯卡拉。

于 2020-11-11T13:40:28.577 回答