是否有人既用于语言实现,又能比较它们,指出它们的优点和弱点?我寻求一个RAD工具,支持AST沃克代码生成。SableCC是LALR,因此支持“左递归”,而ANTLR是LL(*)。对于典型的语法或DSL来说,这很重要吗?我也需要做一些特定领域的分析。(我的编译器的目标语言是OpenCL C)。由于这将是一个学生项目,重要的是,我不要浪费那么多时间在乏味的一面,也就是执行前端的语言。
发布于 2012-07-30 20:41:38
关于ANTLR,我不能说太多,但可能是关于SableCC的一些信息。
设计
它生成了一个解析器,生成的代码和手写的代码使用访问者模式清晰地分离,并集成了从具体语法树到抽象语法树的转换。因此,设计器可以在解析器成功地解析输入之后获得AST,并且可以遍历树并对相应的节点进行操作。
设计人员可以首先编写和调试语法,优化从具体语法树到抽象语法树的转换。当他有了一个坚实的AST之后,他可以在分离的类中编写动作代码。因此,设计人员只编写一次语法,并且可以为语法编写更多类型的操作,例如一次用于语法突出显示,一次用于语义分析和代码生成器。我是在一个富有成效的系统里这样做的。效果很好。
使用ANTLR,设计器可以通过在语法中添加动作代码来构造AST树,从而生成AST,然后以不同的方式重用它。但是在生成的代码和手写的代码之间并没有清晰的分离。
另一个方面可能支持IDE。由于使用了SableCC,您可以很容易地使用IDE的自动完成功能.
文法
SableCC是一个LR(1)解析器生成器,因此它更容易编写语法,这是一个LL(k)解析器生成器(没有技巧)。我认为(不确定) SableCC是唯一一个LR(1) java解析器生成器,它非常流行。
输出解析器
ANTLR可以用多种语言生成解析器,而SableCC只能在Java (主流)中生成解析器。有一些插件/适配器可以用其他语言生成解析器,但是根据作者(http://www.mare.ee/indrek/sablecc/)的说法,它们太老了。SableCC 4可以生成更多的内容,但是它还处于测试阶段,这不适合于严肃的项目。
开发支持
要写语法就得用IDE。它是ANTLRWorks,它可以可视化语法,在源中导航(比如跳转到令牌的定义或生产)。SableCC帽子没有这样的工具。VIM有原始语法突出显示脚本,Netbeans有一个糟糕的特性插件。
结论
我认为对于大型工程,需要长期维护的SableCC比ANTLR更适合。
Martin有关于SableCC的信息,您可以在这里找到它。http://martinfowler.com/bliki/HelloSablecc.html
https://stackoverflow.com/questions/8526955
复制相似问题