在使用ANTLR4编写多种程序语言代码生成JSON格式的抽象语法树(AST)过程中,我重写了Listener类以实现逐个访问ast。现在我扩展其他语言时发现我重写的MyListener类继承自我自定义的语法MyCGrammer的listener基类,即MyCGrammerBaseListener。
public class MyListener extends MyCGrammerBaseListener{
public String oFile=new String();
public Stack<ASTNode> NodeStack=new Stack<>();
@Override public void enterCompilationUnit(MyCGrammerParser.CompilationUnitContext ctx) {
ASTCompilationUnit node = new ASTCompilationUnit();
NodeStack.push(node);
}
@Override public void exitCompilationUnit(MyCGrammerParser.CompilationUnitContext ctx) {
ASTNode node=NodeStack.pop();
node.children.addAll(((ASTCompilationUnit)node).items);
以上代码中MyCGrammerBaseListener和MyCGrammerParser.CompilationUnitContext都是我自己测试用的语法用antlr编译出来的库,无法迁移至其他语言。
我的解答思路和尝试过的方法
我曾尝试过把MyCGrammerParser改成org.antlr.v4.runtime.Parser,因为前者继承自后者,但是改完后org.antlr.v4.runtime.Parser并没有CompilationUnitContext方法。
我想要达到的结果
不知道有没有人知道ANTLR的listener是否有共同基类,可以方便的为多种语言做扩展的。(可以在实际调用函数中传入不同语言Parser,Lexer,Listener对象,定义时用其共同的基类)