用于DSL实现的ANTLR或SableCC?

用于DSL实现的ANTLR或SableCC?,antlr,dsl,abstract-syntax-tree,sablecc,Antlr,Dsl,Abstract Syntax Tree,Sablecc,是否有人同时用于语言实现和 能够比较它们,指出它们的优点和优点 弱点?我寻求一个RAD工具,支持 AST Walker代码生成。SableCC是LALR,因此 支持“左递归”,而ANTLR是LL(*)。 这对典型语法或DSL重要吗?我需要 还要执行一些特定于领域的分析。(目标 我的编译器的语言将是OpenCLC)。就这样 对于一个学生项目来说,重要的是我不会输 那么多的时间在乏味的方面,那就是实施 语言的前端。关于ANTLR,我不能说太多,但可能有一些关于SableCC的信息 设计 它生成一个解

是否有人同时用于语言实现和 能够比较它们,指出它们的优点和优点 弱点?我寻求一个RAD工具,支持 AST Walker代码生成。SableCC是LALR,因此 支持“左递归”,而ANTLR是LL(*)。 这对典型语法或DSL重要吗?我需要 还要执行一些特定于领域的分析。(目标 我的编译器的语言将是OpenCLC)。就这样 对于一个学生项目来说,重要的是我不会输 那么多的时间在乏味的方面,那就是实施
语言的前端。

关于ANTLR,我不能说太多,但可能有一些关于SableCC的信息

设计

它生成一个解析器,使用Visitor模式将生成的代码和手工编写的代码清晰地分离,并集成了从具体语法树到抽象语法树的转换。因此,在解析器成功解析输入后,设计者可以获得AST,并且他可以遍历树并在相应的节点上执行操作

设计者可以首先编写和调试他的语法,尝试优化从具体语法树到抽象语法树的转换。在他有了坚实的AST之后,他可以在单独的类中编写操作代码。因此,设计者只需编写一次语法,就可以为语法编写更多类型的操作,例如,一次用于语法突出显示,一次用于语义分析和代码生成器。我是在一个富有成效的系统中做这件事的。它工作得很好

使用ANTLR,设计者可以通过在语法中添加操作代码来构造AST树,生成AST,然后以不同的方式重用它。但在生成的代码和手工编写的代码之间并没有一个清晰的分离

另一方面可能支持IDE。由于使用SableCC可以分离代码,所以可以轻松使用IDE的自动完成功能

语法

SableCC是一个LR(1)解析器生成器,因此为ANTLR编写语法比较容易,它是一个LL(k)解析器生成器(没有技巧)。我认为(aber不确定)SableCC是唯一一个如此流行的LR(1)java解析器生成器

输出解析器

ANTLR可以用多种语言生成解析器,而SableCC只能用Java(主流)生成解析器。然而,作者表示,有一些插件/适配器可以用其他语言生成解析器(http://www.mare.ee/indrek/sablecc/)他们太老了。SABLECC4可以产生更多,但它是在测试版,这是不推荐的严重项目

开发支持

ANTLR是编写语法的IDE。这是ANTLRWorks,它可以在源代码中导航(比如跳转到令牌或产品的定义)。SableCC没有这样的工具。VIM有原始语法突出显示脚本,Netbeans有一个糟糕的特性插件

结论

我认为对于大型项目,需要长期维护的SableCC比ANTLR更合适

Martin Fowler提供了有关SableCC的信息,您可以在这里找到。

如果您的目标是OpenCL,您不需要了解很多DSL中操作数的数据类型吗?这意味着符号表和类型推断,即ANTLR和SableCC都不提供任何特定的支持。我只是观察到你应该选择你的DSL工具,考虑它需要提供什么机制,不仅仅是解析。如果你只需要解析(你怎么知道呢??),那么这两种类型中的任何一种都是不错的选择。唯一支持的数据类型是单精度浮点数,因为在大多数GPU架构上,整数运算的速度都不太快。我仍然需要在这个领域(神经元模型)上做一些阅读工作,但主要是我认为我必须走一棵树。我听说SableCC生成实现访问者设计模式的类。另一方面,ANTLR有一个>>>用户社区,我可以获得更好的教程、书籍和文档。如果是GPU,您将需要您认为支持的任何数据类型的(隐式或显式)数组,否则您将无法获得计算马力。如果它是一个好的DSL,那么它就不会因为实现对单精度浮点的坚持而中毒,因此我希望您有INT,以及适合问题的各种精度浮点,而不是GPU。如果你是一名学生,你可以做任何你喜欢的事。。。。就代码生成而言,如果解析到一棵树中,除了在生成代码之前遍历它之外别无选择。真正的问题是,在给定DSL规范的情况下,如何为GPU生成高效的代码?除非您的DSL域三位一体地匹配GPU的功能,否则您必须从树的不同部分收集信息,以决定为每个树节点生成什么。因此,简单的“线性”树木行走可能不会奏效。你需要阅读有关优化编译器的书籍,或者放弃好代码生成的想法。我认为答案是,“不仅仅是解析器生成器”。如果你对解析和分析你的DSL代码很认真,你会发现选择一个“单纯的解析”引擎对你没有多大帮助。您需要更多的机制,就像解析器生成器一样,您真的不想自己构建所有的机制。请看我关于解析后的生活的文章:是的,我同意。解析只是开始。一旦有了AST,就有太多的事情要做了。因此,我希望有一个自动生成的AST,而不仅仅是自己编写。我认为是这样。我不是解析器和编译器专家,只是个业余爱好者。据我所知,SABLE和ANTLR都不会自动生成AST;你的意思似乎有点帮助。我们的DMS会自动生成AST;语法输入,语法分析器+AST输出。那么,请告诉我如何尝试您的DMS,您有评估许可证或试用版或类似的东西吗?在SableCC中,设计师可以告诉它,哪一个/如何生成AST