antlr 生成的 java 代码未触发方法

Method not triggered from antlr generated java code

我正在尝试计算 java 代码 A.java 中的方法声明,使用 Antlr 为 Java 生成的解析器和词法分析器来自 Github。我正在尝试的代码如下:

TestListener.java

package antlrjavaparser;

import java.io.FileInputStream;
import java.io.InputStream;

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

public class TestListener extends Java8BaseListener{
    static int methodCount=0;
    public static void main(String args[]) throws Exception {

        InputStream in = new FileInputStream("src/main/java/A.java");
        ANTLRInputStream input = new ANTLRInputStream(in);
         if (in == null){
             System.err.println("Unable to find test file.");
         }
        Java8Lexer lex = new Java8Lexer(input);
        
        CommonTokenStream tokens = new CommonTokenStream(lex);
        Java8Parser parser = new Java8Parser(tokens);

        ParseTree tree = null;
        tree = parser.compilationUnit();
        ParseTreeWalker walker = new ParseTreeWalker();
        Java8BaseListener listener = new Java8BaseListener();
        walker.walk(listener, tree);
        printTokens(lex);

        System.out.println(methodCount);
        
        }

    private static void printTokens(Java8Lexer lex) {
        // Print tokens
        Token token = null;
     
        while ((token = lex.nextToken()) != null) {
            
            if (token.getType() == Token.EOF) {
                break;
            }
            if (token.getChannel() == Token.HIDDEN_CHANNEL) {
                continue;
                
            }
        System.out.println("Token: [" + token.getText() + "] Type:[" + token.getType() + "]");

        }

        lex.reset();
    }
    @Override
    public void enterMethodDeclaration(Java8Parser.MethodDeclarationContext ctx) { 
        methodCount++;
    }
}

methodCount 每次打印 0A.java 是一个非常简单的 java class 包含一些方法。我已经尝试覆盖 Java8BaseListener 中的多个方法,以查看是否有任何方法被触发,但看起来它们没有被触发。我使用antlr错了吗?我使用 walker 的方式有什么问题吗?我两天前才开始研究这个,所以我不太了解 antlr。任何帮助将不胜感激。

Java8BaseListener listener = new Java8BaseListener();

在这里,您正在实例化基本侦听器,它什么也不做。您应该实例化它的子类。所以:

Java8BaseListener listener = new TestListener();