首页 > 解决方案 > 方法未从 antlr 生成的 java 代码触发

问题描述

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

测试监听器.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++;
    }
}

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

标签: javaparsingantlrantlr4lexer

解决方案


Java8BaseListener listener = new Java8BaseListener();

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

Java8BaseListener listener = new TestListener();

推荐阅读