使用导入的语法时,ANTLR4能否生成共享代码?

使用导入的语法时,ANTLR4能否生成共享代码?,antlr4,Antlr4,我有两种语言,分别称为A和B(使用AGrammar.g4、BGrammar.g4、ALexer.g4和BLexer.g4)。B是a的超集,因此我有B导入a 我有一个将A编译成X语言的访问者代码 我正在编写将B编译成X语言的访问者代码,并希望重用A2X代码。但是,生成的B.java代码重新定义了A.java中已经存在的所有嵌套规则类 有没有办法让B.java重新使用A.java中生成的代码,这样我就不必复制所有A访客代码?没有。而且没有提供足够的信息来建议替代方案。如果BLang真的是ALang的

我有两种语言,分别称为A和B(使用AGrammar.g4、BGrammar.g4、ALexer.g4和BLexer.g4)。B是a的超集,因此我有B导入a

我有一个将A编译成X语言的访问者代码

我正在编写将B编译成X语言的访问者代码,并希望重用A2X代码。但是,生成的B.java代码重新定义了A.java中已经存在的所有嵌套规则类


有没有办法让B.java重新使用A.java中生成的代码,这样我就不必复制所有A访客代码?

没有。而且没有提供足够的信息来建议替代方案。如果BLang真的是ALang的超集,那么您可以使用一个语法来处理这两个语法。为什么这样不行?为了避免重复AVisitor代码,让BVisitor扩展AVisitor。为什么这行不通呢?简单的回答是,我想让ALang独立于BLang(ALang是一个标准的一部分,BLang包含我们的扩展)使用。BVisitor无法扩展AVisitor,因为AVisitor具有visitExpr(AGrammar.ExprContext ctx)和BVisitor具有visitExpr(BGrammar.ExprContext ctx)——为AGrammar规则expr生成了两个嵌套的静态类