Поиск…


Вступление

В чем разница между слушателем и посетителем? Разница между механизмами слушателя и посетителя - это методы слушателя, вызываемые объектом walker, предоставленным ANTLR, тогда как методы посетителей должны перемещать своих детей с явным вызовом посещения. Забытие вызова функции посещения () для дочерних узлов узла означает, что эти поддеревья не посещаются. У посетителя есть возможность ходить по деревьям, а в слушателе вы реагируете только на пешеход.

пример

Пример грамматики (Expr.g4)

grammar Expr; 
prog:    (expr NEWLINE)* ;
expr:    expr ('*'|'/') expr

    |    expr ('+'|'-') expr
    |    INT
    |    '(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

Создание посетителя

Чтобы создать посетителя или отключить посетителя для вашей грамматики, вы используете следующие флаги:

 -visitor            generate parse tree visitor
 -no-visitor         don't generate parse tree visitor (default)

Команда командной строки / терминала для создания вашей грамматики с посетителем будет отформатирована, как показано ниже, в отношении выбранного флага и возможных псевдонимов:

java - jar antlr-4.5.3-complete.jar Expr.g4 -visitor
java - jar antlr-4.5.3-complete.jar Expr.g4 -no-visitor

Результатом будет синтаксический анализатор / лексер с посетителем или посетителем, соответственно.

Результат. В этом примере вывод будет ExprBaseVisitor.java и ExprVisitor.java . Это соответствующие java-файлы для реализации функций посетителя. Часто идеально подходит для создания нового класса и расширения ExprBaseVisitor для реализации новых функций посетителя для каждого метода.

// Generated from Expr.g4 by ANTLR 4.5.3
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;

/**
 * This class provides an empty implementation of {@link ExprVisitor},
 * which can be extended to create a visitor which only needs to handle a subset
 * of the available methods.
 *
 * @param <T> The return type of the visit operation. Use {@link Void} for
 * operations with no return type.
 */
public class ExprBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements ExprVisitor<T> {
    /**
     * {@inheritDoc}
     *
     * <p>The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.</p>
     */
    @Override public T visitProg(ExprParser.ProgContext ctx) { return visitChildren(ctx); }
    /**
     * {@inheritDoc}
     *
     * <p>The default implementation returns the result of calling
     * {@link #visitChildren} on {@code ctx}.</p>
     */
    @Override public T visitExpr(ExprParser.ExprContext ctx) { return visitChildren(ctx); }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow