什么更好,ANTLR或者JavaCC?
关注的是文档/可学习性,eclipse集成,工具,社区支持和性能(大致顺序)。
有几个select你不应该排除:
- JParsec是一个parsing器combobox架,允许您完全从代码构build您的parsing器。
- Scala的parsing器combobox架解决了类似的问题; 不过,Scala的语法使得所有这些更加可读。
- 接下来还有John Metsker为他的书“ Parsers With Java”编写的parsing器combobox架; 我不记得图书馆在哪里,但过去至less在互联网上浮动。 它解决了同样的问题:您不要在一个单独的非Java文件中定义您的语法和令牌定义; 相反,这全是Java。
- Fortress,Sun公司多年来一直致力于开发的编程语言似乎都是build立在这个工具箱之上的: 老鼠 。 我没有太多的信息,但是我认为如果他们将它用于新的编程语言,它可能会有一些有趣的function。
一般来说,我觉得代码生成器的年代已经结束了。 如果我是你,我会使用Scala的parsing器组合工具包。 基本上,任何支持Scala的IDE,也都支持这个parsing器combobox架。 性能很好,AFAICT。
顺便说一下,ANTLR作为一个Eclipse插件提供了非常好的IDE支持(但也许在IntelliJ中也有一些东西 – 我不记得了)。所以,如果你select经典的方法来定义你的词法分析器和parsing器,你的语言,那么ANTLR应该是你的select,我想。 它在Java开发人员中具有最大的意义,有工具支持,ANTLR的作者有一本很好的书。 我不认为其他工具包可以声称。
关于你提到的问题,我build议JavaCC是一个更好的select。 Java开发人员学习起来更快,更容易(语法与普通Java非常相似),文档是全面的,而且Eclipse集成是足够的。
对于第一个近似,在实践中真正重要的是符号对你的眼睛是多么方便和直观。
话虽如此,我已经完成了ANTLR和JavaCC的项目,并发现ANTLR对于大多数事情来说是非常重量级的。
ANTLRfunction更加全面:它是一个更加出类拔萃的编译器编译器 – parsing,AST,树转换和代码生成。
对于JavaCC来说,它比编译器编译器更像Parser生成器。 AST支持通过称为JJTree的另一个库提供。
ANTLR比JavaCC具有的一个具体优点是它具有除Java之外的其他语言的生成器。 这可能会使您的语言更容易移植到其他地方。
我有一段时间没有使用parsing器生成器,但几年前,当我对它们感兴趣的时候,我记得最喜欢SableCC 。 它实现了一些关于面向对象的parsing器生成的有趣的想法,这些想法可能会或可能不会被替代方法所挑选。
我第二个jamesh以上。
ANTLRfunction更加全面:它是一个更加出类拔萃的编译器编译器 – parsing,AST,树转换和代码生成。
对于JavaCC,它比编译器编译器更像Parser生成器。 AST支持通过称为JJTree的另一个库提供。
从我个人的经验来看,您可以使用ANTLR做更多的事情,包括在规则和所有子规则之间传递参数,这在制作复杂的parsing器(如C#的parsing器)方面有很多帮助。 而且,重写规则也是一个经典。 它可以帮助你轻松地格式化你的理想AST。
但是,真的很重。 对于一个简单的项目,你可能永远不会使用这些function。 Javacc比较酷。
我使用SableCC为Maple或MuPAD等CAS语言编写了一个编译器,将此单一语言转换为Maxima(CAS容量)和LaTeX(显示)。 SableCC的AST是严格的面向对象的,很容易扩展它来生成diffence语言。 如果你想将一种语言编译成多于一种的语言,只需试一试。