47

关注点是文档/可学习性、eclipse 集成、工具、社区支持和性能(大致按此顺序)。

4

8 回答 8

30

您不应该排除以下几种选择:

  • JParsec是一个解析器组合器框架,它允许您完全从代码构建解析器。
  • Scala 的解析器组合器框架解决了类似的问题。然而,Scala 的语法使所有这些都更具可读性。
  • 然后还有 John Metsker 为他的书Building Parsers With Java完成的解析器组合器框架;我不记得图书馆的确切位置,但至少过去它在互联网上流传。它解决了同样的问题:您没有在单独的非 Java 文件中定义语法和标记定义;相反,这都是Java。
  • Fortress,Sun 多年来一直致力于开发的编程语言,现在似乎是建立在这个工具包上的:Rats。我没有太多信息,但我认为如果他们将它用于他们的新编程语言,它可能有一些有趣的特性。

总的来说,我的印象是代码生成器的时代已经结束。如果我是你,我会使用 Scala 的解析器组合器工具包。基本上,任何支持 Scala 的 IDE 也“支持”这个解析器组合器框架。性能很好,AFAICT。

顺便说一句,ANTLR 有相当不错的 IDE 支持,作为一个 Eclipse 插件(但也许 IntelliJ 中也有一些东西 - 我不记得了。)所以,如果你选择在外部定义词法分析器和解析器的经典方法你的语言,那么 ANTLR 应该是你的选择,我认为。它在 Java 开发人员中占有最大的份额,有工具支持,还有 ANTLR 作者的一本好书。我认为任何其他工具包都不能声称这一点。

于 2010-01-30T08:48:22.030 回答
11

ANTLR 功能更全面:它是一个开箱即用的编译器编译器——词法分析、解析、AST、树转换和代码生成。

对于 JavaCC,它更像是一个解析器生成器,而不是一个编译器编译器。AST 支持是通过另一个名为 JJTree 的库提供的。

于 2008-12-21T20:50:52.980 回答
11

关于您提到的问题,我建议 JavaCC 是一个更好的选择。Java开发人员学习起来更快更容易(语法与普通Java极为相似),文档全面,Eclipse集成充足。

于 2010-01-30T08:27:01.007 回答
10

粗略地说,在实践中对你来说真正重要的是符号对你的眼睛有多方便和直观。

话虽如此,我已经使用 ANTLR 和 JavaCC 完成了项目,并且发现 ANTLR 在大多数事情上都是非常重量级的。

于 2008-12-19T22:05:41.783 回答
8

ANTLR 相对于 JavaCC 的一个具体优势是它具有 Java 以外的其他语言的生成器。这可能会使您的语言更容易移植到其他地方。

于 2009-07-05T04:05:37.607 回答
4

我在上面第二个jamesh。

ANTLR 功能更全面:它是一个开箱即用的编译器编译器——词法分析、解析、AST、树转换和代码生成。

对于 JavaCC,它更像是一个解析器生成器,而不是一个编译器编译器。AST 支持是通过另一个名为 JJTree 的库提供的。

根据我的个人经验,你可以用 ANTLR 做更多的事情,包括在规则之间传递参数以及通过所有子规则,这在制作复杂的解析器时很有帮助,比如 C# 的解析器。此外,规则重写也是经典之作。它可以帮助您轻松格式化理想的 AST。

然而,它真的很重。对于一个简单的项目,您可能永远不会使用这些功能。Javacc 更酷。

于 2009-07-05T03:49:32.127 回答
2

我有一段时间没有使用解析器生成器了,但几年前我对它们感兴趣时,我记得我最喜欢SableCC。它实现了一些关于面向对象解析器生成的有趣想法,这些想法可能会或可能不会被替代方案采用。

于 2008-12-29T19:19:46.213 回答
2

我用 SableCC 为 CAS 语言(如 Maple 或 MuPAD)编写了一个编译器,将这种单一语言转换为 Maxima(用于 CAS-Capacity)和 LaTeX(用于显示)。SableCC 的 AST 是严格的面向对象的,很容易扩展它以生成不同的语言。如果您想将一种语言编译成多种其他语言,请尝试一下。

于 2012-03-19T23:49:53.693 回答