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

Scala解析器组合器与ANTLR/Java生成的解析器?,java,parsing,scala,antlr3,parser-combinators,Java,Parsing,Scala,Antlr3,Parser Combinators,我正在为一个主要用Scala编写的应用程序编写表达式解析器。我已经在Scala中构建了AST对象,现在需要编写解析器。我听说过Scala的内置解析器组合器,也听说过ANTLR3,我想知道:哪一种会提供更好的性能和编写代码的方便性?到目前为止: ANTLR-pros 著名的 快速 外部DSL ANTLRWorks(用于语法分析器调试/测试的优秀IDE) ANTLR cons 基于Java(Scala互操作可能具有挑战性,有经验吗?) 在运行时需要很大的依赖项 解析器组合器的优点 斯卡拉的一部分 少

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

ANTLR-pros

  • 著名的
  • 快速
  • 外部DSL
  • ANTLRWorks(用于语法分析器调试/测试的优秀IDE)
  • ANTLR cons

  • 基于Java(Scala互操作可能具有挑战性,有经验吗?)
  • 在运行时需要很大的依赖项
  • 解析器组合器的优点

  • 斯卡拉的一部分
  • 少建一步
  • 不需要运行时依赖项;e、 g.已经包含在Scala的运行库中
  • 解析器组合符cons

  • 内部DSL(可能意味着执行速度较慢?)
  • 没有AntlWorks(提供了很好的解析器测试和可视化特性)
  • 有什么想法吗


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

    我倾向于尝试使用解析器组合器生成外部DSL。它不需要是内部DSL。但我不知道这样会更好


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

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


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

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


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

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

    刚刚为一个自制8位CPU汇编程序编写了一个解析器

    在我觉得必须有更好的方法之前,我已经使用了Antlr4。
    我决定试一试Scala解析器组合器,并且不得不说它的效率要比IMHO高很多。但是,我知道scala。

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


    另一个更简单的表达式解析器也出现在我的另一个公共存储库中

    我没有使用Scala的经验(因此它是解析器组合器),所以我不能推荐。但是,对于在这两方面都有经验的人,您可能想解释一下您的表达式解析器(将要)能够做什么:它是否支持变量范围,或者某种类型的类/结构?函数声明。。。为什么你认为是一个内部DSL一个骗局?@ JEN,因为它可能导致执行速度较慢。您知道预编译与内部DSL的性能对比吗?我很高兴听你这么说。我没有绩效信息。您指的是结果解析器的性能吗?还是解析器生成步骤的性能?首先,内部与外部的对比应该无关紧要。第二,我希望内部DSL更快,因为它不需要在解释之前进行解析这里有一点meta*/我说的“内部DSL”是指语法定义是一个内部DSL。我已经试过了,效果很好。它也能很好地处理Scalas case类(JFlex/JavaCup也是如此,顺便说一句:-)我的问题是我的AST对象只在Scala中…有没有办法在ANTLR解析器中调用这些对象?如果你想从Java调用Scala并使它看起来漂亮,你的Scala不能依赖于Scala特定的语言特性,比如隐式转换,隐式参数、默认参数、符号方法名称、按名称参数等。泛型也应保持相对简单。如果您认为Scala对象相对简单,那么从Java使用它们应该不会有任何问题。