Метод не запускается из java-кода, сгенерированного antlr

Я пытаюсь подсчитать объявления методов в моем 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. Любая помощь будет оценена по достоинству.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Java8BaseListener listener = new Java8BaseListener();

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

Java8BaseListener listener = new TestListener();

Большое спасибо!

zach 16.09.2018 01:10

Другие вопросы по теме