修改Java语法

修改Java语法,java,syntax,abstract-syntax-tree,rascal,Java,Syntax,Abstract Syntax Tree,Rascal,我希望使用m3库中提供的Rascal现有Java AST,但我想扩展它以添加一些特性。我们正在使用一种类似Java的语言(大约95%是Java,5%是我们的特定功能)。理想情况下,我希望能够使用Java语法和AST代码(src/org/rascalmpl/library/lang/Java/syntax/Java15.rsc和src/org/rascalmpl/library/lang/Java/m3/AST.rsc)分别修改语法并添加一些新的AST节点。仔细研究和探索这一切是如何工作的,结果表

我希望使用m3库中提供的Rascal现有Java AST,但我想扩展它以添加一些特性。我们正在使用一种类似Java的语言(大约95%是Java,5%是我们的特定功能)。理想情况下,我希望能够使用Java语法和AST代码(
src/org/rascalmpl/library/lang/Java/syntax/Java15.rsc
src/org/rascalmpl/library/lang/Java/m3/AST.rsc
)分别修改语法并添加一些新的AST节点。仔细研究和探索这一切是如何工作的,结果表明,这一切的工作原理与我发现的其他语言示例不同

例如,
Java15.rsc
中的构造函数与
AST.rsc
中的构造函数不匹配,这就是所有其他语言示例的工作方式。我目前对这一切工作原理的理解是,当用户调用
createAstFromFile()
时,实际发生的是对生成AST的某些Java代码的Rascal调用

我已经尝试了很多方法,最成功的方法是开始重命名
Java15.rsc
中的构造函数,以匹配
AST.rsc
中的构造函数,但在我意识到这将是一项艰巨的任务并且可能不是解决此问题的最佳方法之前,我没有走得太远

我是否可以“轻松”提取这里的语法和AST部分,并自己修改它们

谢谢。

M3(它是AST)已断开与Java15语法的连接。它使用EclipseJDT进行解析和名称绑定。如果要扩展AST,可以向ADT添加新的构造函数

data Expression = delayedCall(Expression receiver, str name, list[Expression] arguments);
向表达式ADT添加新的替代项


但是,我们没有用于AST的java打印机,因此根据您想要做的事情,您可能实际上需要为您的语言编写语法并使用解析树。您可以用与ADT类似的方式扩展语法。

您是坚持使用流氓答案,还是对其他可能让您表达您的确切语法的方式感兴趣?是的,流氓是我们目前使用的工具。我已经用流氓语言编写了一堆代码,这些代码已经进行了一些处理。我宁愿不改变它。你有什么建议吗?你考虑过DMS吗?您可以为它提供基本语法和方言变体。谢谢,戴维。这里到底是什么
delayedCall()
?如果我以这种方式修改AST,我将无法修改具体的语法?嗨,Josh。因为对于m3前端的java,我们使用了EclipseJava编译器,您必须扩展所述编译器以实现语法扩展。另一种选择是使用Rascal语法for java并简单地扩展它,编写一个到普通java的desugaring,然后可以使用Eclipse编译器再次编译它。最后,最后一个选项是咬紧牙关,编写一个完整的java前端,将java语法生成的具体树映射到m3树和关系。相当于一个完全可扩展的java前端,与jastadd java编译器套件相当。太好了,谢谢!这无疑给了我们一些可以合作/思考的东西。