关注点是文档/可学习性、eclipse 集成、工具、社区支持和性能(大致按此顺序)。
8 回答
您不应该排除以下几种选择:
- 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 作者的一本好书。我认为任何其他工具包都不能声称这一点。
ANTLR 功能更全面:它是一个开箱即用的编译器编译器——词法分析、解析、AST、树转换和代码生成。
对于 JavaCC,它更像是一个解析器生成器,而不是一个编译器编译器。AST 支持是通过另一个名为 JJTree 的库提供的。
关于您提到的问题,我建议 JavaCC 是一个更好的选择。Java开发人员学习起来更快更容易(语法与普通Java极为相似),文档全面,Eclipse集成充足。
粗略地说,在实践中对你来说真正重要的是符号对你的眼睛有多方便和直观。
话虽如此,我已经使用 ANTLR 和 JavaCC 完成了项目,并且发现 ANTLR 在大多数事情上都是非常重量级的。
ANTLR 相对于 JavaCC 的一个具体优势是它具有 Java 以外的其他语言的生成器。这可能会使您的语言更容易移植到其他地方。
我在上面第二个jamesh。
ANTLR 功能更全面:它是一个开箱即用的编译器编译器——词法分析、解析、AST、树转换和代码生成。
对于 JavaCC,它更像是一个解析器生成器,而不是一个编译器编译器。AST 支持是通过另一个名为 JJTree 的库提供的。
根据我的个人经验,你可以用 ANTLR 做更多的事情,包括在规则之间传递参数以及通过所有子规则,这在制作复杂的解析器时很有帮助,比如 C# 的解析器。此外,规则重写也是经典之作。它可以帮助您轻松格式化理想的 AST。
然而,它真的很重。对于一个简单的项目,您可能永远不会使用这些功能。Javacc 更酷。
我有一段时间没有使用解析器生成器了,但几年前我对它们感兴趣时,我记得我最喜欢SableCC。它实现了一些关于面向对象解析器生成的有趣想法,这些想法可能会或可能不会被替代方案采用。
我用 SableCC 为 CAS 语言(如 Maple 或 MuPAD)编写了一个编译器,将这种单一语言转换为 Maxima(用于 CAS-Capacity)和 LaTeX(用于显示)。SableCC 的 AST 是严格的面向对象的,很容易扩展它以生成不同的语言。如果您想将一种语言编译成多种其他语言,请尝试一下。