Посетитель и слушатель одновременно в Антлр 4

В Antlr 4 мы можем позвонить нашему посетителю или классу слушателей отдельно. Но я хочу называть это по очереди, я имею в виду, что когда я посещаю дерево с помощью посетителя, мой класс прослушивателя также должен выполняться. Посмотрите на мой пример кода ниже MXLVisitor.

ANTLRFileStream reader = new ANTLRFileStream(input.toString());
        Xml_formatLexer lexer = new Xml_formatLexer(reader);
        Xml_formatParser parser = new Xml_formatParser(new CommonTokenStream(lexer));
        ParseTree tree = parser.main_rule();
        MXLVisitor visitor = new MXLVisitor(xmlBuilder, pojo);

        Value result = visitor.visit(tree);

        ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
        MXLlistener extractor = new MXLlistener();
        walker.walk(extractor, tree);

в то время как я запускаю этот код выше visit(tree) Сначала метод, а затем walker.walk(extractor, tree) согласно моей кодировки.

Мой вопрос: можно ли вызывать оба метода одновременно?

1 ответ

Решение

Мой вопрос: можно ли вызывать оба метода одновременно?

Нет, вы либо используете слушателя или посетителя. Не оба одновременно.

Я заметил, что проект presto использует слушателя и посетителя одновременно, как раз для описанного вами варианта использования!

Примерная идея:

MyBaseParser parser = new MyBaseParser(tokenStream);

//First setup the listener.
parser.addParseListener(new MyListener());
ParseTree tree = parser.main_rule();

//Then setup the visitor
MyVisitor visitor = new MyVisitor(...);
Value result = visitor.visit(tree);

Вот их код:https://github.com/prestodb/presto/blob/8d5d5e67e1e2276e9e2a1fc02f471e6d0a020c89/presto-parser/src/main/java/com/facebook/presto/sql/parser/SqlParser.java

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