是否有人将这两种语言都用于语言实现并能够比较它们,指出优缺点?我寻求一个支持 AST Walker 代码生成的 RAD 工具。SableCC 是 LALR,因此支持“左递归”,而 ANTLR 是 LL(*)。这对典型的语法或 DSL 很重要吗?我还需要执行一些特定领域的分析。(我的编译器的目标语言是 OpenCL C)。因为这将是一个学生项目,所以重要的是我不会在繁琐的方面浪费太多时间,即实现语言的前端。
1 回答
我不能说太多关于 ANTLR,但也许是关于 SableCC 的一些信息。
设计
它生成一个解析器,使用访问者模式将生成的代码和手写代码完全分离,并集成了从具体语法树到抽象语法树的转换。结果,在解析器解析成功后,设计者可以得到一个AST,他可以遍历树并对相应的节点进行操作。
设计者可以先编写和调试他的语法,尝试优化从具体语法树到抽象语法树的转换。在他拥有扎实的 AST 之后,他可以在单独的班级中编写动作代码。所以设计者只写一次语法,可以为语法编写更多类型的动作,例如语法高亮一次,语义分析和代码生成器一次。我已经在一个生产系统中做到了。它工作得很好。
使用 ANTLR,设计者可以通过在语法中添加动作代码来构建 AST 树以生成 AST,然后以不同的方式重用它。但是生成的代码和手写代码之间并没有明确的区别。
另一个方面可能是对 IDE 的支持。由于使用 SableCC,您已经分离了代码,您可以轻松使用 IDE 的自动完成功能。
语法
SableCC 是一个 LR(1) 解析器生成器,因此 IMO 更容易为 ANTLR 编写语法,它是一个 LL(k) 解析器生成器(没有技巧)。我认为(aber 不确定)SableCC 是唯一一个如此受欢迎的 LR(1) java 解析器生成器。
输出解析器
ANTLR 可以生成多种语言的解析器,而 SableCC 只能生成 Java(主流)的解析器。有一些插件/适配器可以生成其他语言的解析器,但是根据作者(http://www.mare.ee/indrek/sablecc/)的说法,它们太旧了。SableCC 4 可以生成更多,但它处于测试阶段,不推荐用于严肃的项目。
发展支持
ANTLR 有一个 IDE 来编写语法。它是 ANTLRWorks,它可以可视化语法,在源中导航(如跳转到标记或生产的定义)。SableCC 没有这样的工具。有用于 VIM 的原始语法高亮脚本和用于 Netbeans 的较差功能插件。
结论
IMO 我认为对于大型项目,需要长期维护 SableCC 比 ANTLR 更合适。
Martin Fowler 有一个关于 SableCC 的信息,你可以在这里找到它。 http://martinfowler.com/bliki/HelloSablecc.html