关注的是文档/可学习性,eclipse集成,工具,社区支持和性能(大致按此顺序)。
答案 0 :(得分:28)
有几种选择你不应该排除:
总的来说,我的印象是代码生成器的年代已经结束。如果我是你,我会使用Scala的解析器组合工具包。基本上,任何支持Scala的IDE也“支持”这个解析器组合框架。表现很好,AFAICT。
顺便说一句,ANTLR有一个相当不错的IDE支持,作为一个Eclipse插件(但也许在IntelliJ中也有一些东西 - 我不记得了。)所以,如果你选择经典的方法来定义你的词法分析器和在你的语言之外解析器,我认为ANTLR应该是你的选择。它是Java开发人员中最大的头脑,有工具支持,ANTLR的作者有一本很好的书。我不认为任何其他工具包可以声称。
答案 1 :(得分:11)
关于您提到的问题,我建议JavaCC是更好的选择。 Java开发人员学习的速度更快,更容易(语法与普通Java非常相似),文档全面,Eclipse集成也足够。
答案 2 :(得分:9)
ANTLR功能更全面:它是一个远远超出盒子编译器编译器 - lexing,parsing,AST,树转换和代码生成。
对于JavaCC,它更像是一个Parser生成器而不是一个编译器编译器。 AST支持是通过另一个名为JJTree的库提供的。
答案 3 :(得分:8)
首先,在实践中对你来说真正重要的是你的眼睛是多么方便直观的符号。
话虽如此,我已经完成了ANTLR和JavaCC的项目,发现ANTLR对于大多数事情来说都是非常重量级的。
答案 4 :(得分:5)
ANTLR对JavaCC的一个具体优势是它具有除Java以外的语言的生成器。这可能会使您的语言更容易移植到其他地方。
答案 5 :(得分:3)
我在上面的第二次jamesh。
ANTLR功能更全面:它是一个 更多的盒子编译器 编译器 - lexing,解析,AST,树 转换和代码生成。
对于JavaCC来说,它更像是一个Parser 生成器比编译器编译器。 通过提供AST支持 另一个叫做JJTree的文库。
根据我的个人经验,您可以使用ANTLR做更多事情,包括在规则之间传递参数以及通过所有子规则,这对于制作复杂的解析器(如C#的解析器)有很大帮助。此外,规则重写也是经典之作。它可以帮助您轻松地格式化您的理想AST。
然而,它真的很重。对于一个简单的项目,您可能永远不会使用这些功能。 Javacc很酷。
答案 6 :(得分:2)
我有一段时间没有使用解析器生成器,但几年前我对它们感兴趣时,我记得最喜欢SableCC。它针对面向对象的解析器生成实现了一些有趣的想法,这些解决方案可能已经或者可能没有被备选方案选择。
答案 7 :(得分:2)
我用SableCC编写了一个用于CAS语言的编译器,如Maple或MuPAD来转换它 Maxima(用于CAS-Capacity)和LaTeX(显示)的单一语言。 SableCC的AST是 严格的面向对象,并且很容易扩展它以生成差异语言。如果你 想要将一种语言编译成多种语言,只需试一试。