Метод не вызван из сгенерированного antlr Java-кода - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь подсчитать объявления методов в моем коде 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 печатает 0 каждый раз. A.java - очень простой Java-класс, содержащий несколько методов.Я попытался переопределить несколько методов из Java8BaseListener, чтобы посмотреть, запущен ли какой-либо из них вообще, но похоже, что это не так.Я неправильно использую antlr?Что-то не так с тем, как я использую walker?Я только начал работать над этим два дня назад, поэтому я не очень хорошо знаю antlr.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 15 сентября 2018
Java8BaseListener listener = new Java8BaseListener();

Здесь вы создаете экземпляр базового слушателя, который ничего не делает. Вы должны инстанцировать свой подкласс этого. Итак:

Java8BaseListener listener = new TestListener();
...