【问题标题】:Method not triggered from antlr generated java code方法未从 antlr 生成的 java 代码触发
【发布时间】:2018-09-15 03:26:49
【问题描述】:

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

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 类,包含一些方法。我已经尝试覆盖Java8BaseListener 中的多个方法,以查看它们中的任何一个是否被触发,但看起来它们没有被触发。我使用antlr错了吗?我使用walker 的方式有什么问题吗?我两天前才开始研究这个,所以我不太了解antlr。任何帮助将不胜感激。

【问题讨论】:

    标签: java parsing antlr antlr4 lexer


    【解决方案1】:
    Java8BaseListener listener = new Java8BaseListener();
    

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

    Java8BaseListener listener = new TestListener();
    

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多