ANTLR4迁移至多语言时的问题

在使用ANTLR4编写多种程序语言代码生成JSON格式的抽象语法树(AST)过程中,我重写了Listener类以实现逐个访问ast。现在我扩展其他语言时发现我重写的MyListener类继承自我自定义的语法MyCGrammer的listener基类,即MyCGrammerBaseListener。

public class MyListener extends MyCGrammerBaseListener{
    public String oFile=new String();
    public Stack 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对象,定义时用其共同的基类)

ANTLR提供了一种使用相同的Listener类来解析不同语言语法的方法。这种方法是通过使用ANTLR的统一语法来实现的。

具体来说,你可以编写一个统一语法,然后使用这个语法来生成不同语言的词法和语法分析器。这些分析器可以使用相同的Listener类来解析语法树。

你可以使用ANTLR的统一语法来实现这一点。这个语法可以支持多种语言,并且可以使用相同的语法来生成不同语言的词法和语法分析器。

具体实现可以参考ANTLR官方文档,里面有更加详细的说明,或者参考其他相关资料。