用于多语言生成的Antlr

用于多语言生成的Antlr,antlr,antlr4,Antlr,Antlr4,这展示了如何创建和使用java语法 但是,这在Exp.g源代码中混合了语法和Java源代码 我的问题是,是否可以将语法文件与目标语言解耦,从而使一个语法文件可以用于生成多个java、斯卡拉、C++等词法/解析器? ,这主要取决于语法中使用目标代码的原因。是否只有操作代码可以对找到的令牌执行某些操作(例如,构建符号表或替代树表示),那么确实没有问题,请删除此类本机代码,然后再进行处理(使用解析树遍历器或访问者) 然而,谓词是不同的。它们用于指导解析器,还需要本机代码。您可以做的是将所有本机代码移动

这展示了如何创建和使用java语法

但是,这在Exp.g源代码中混合了语法和Java源代码


我的问题是,是否可以将语法文件与目标语言解耦,从而使一个语法文件可以用于生成多个java、斯卡拉、C++等词法/解析器?

,这主要取决于语法中使用目标代码的原因。是否只有操作代码可以对找到的令牌执行某些操作(例如,构建符号表或替代树表示),那么确实没有问题,请删除此类本机代码,然后再进行处理(使用解析树遍历器或访问者)

然而,谓词是不同的。它们用于指导解析器,还需要本机代码。您可以做的是将所有本机代码移动到生成的解析器所派生的基类中。然后,您只需要用目标语言重新编写这个基类,并使语法基本上不包含本机代码(除了调用本机代码的单个函数调用)


这种方法的优点是不需要额外的库引用(C/C++中包含,其他语言中导入),这也是防止多目标使用的本机代码。

一般来说,.g语法确实与目标语言解耦,这一点在Exp.g中似乎是如此。例如,C++的目标是:我认为,在java之外编写目标超出了ANTLR项目本身believe@SimonMourier-我认为你误解了这个问题。Exp.g引用d与Java混合使用。这就是我试图避免的。将依赖于目标的逻辑移动到解析器的基类并不会从语法中删除目标依赖性,因为解析器(在@header部分)仍然需要以依赖于目标语言的方式导入超类。