Посетитель и слушатель одновременно в Антлр 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);