Buscar..


Introducción

¿Cuál es la diferencia entre un oyente y un visitante? La diferencia entre los mecanismos de escucha y visitante es que los métodos de escucha son llamados por el objeto caminante proporcionado por ANTLR, mientras que los métodos de visita deben guiar a sus hijos con llamadas de visita explícitas. Olvidarse de invocar visit () en los hijos de un nodo significa que esos subárboles no son visitados. En el visitante, tenemos la posibilidad de caminar por el árbol, mientras que en el oyente solo estás reaccionando al caminante del árbol.

Ejemplo

Ejemplo de gramática (ejemplo 4)

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

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

Generando el visitante

Para generar un visitante, o para deshabilitar un visitante para su gramática, use los siguientes indicadores:

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

El comando de línea de comando / terminal para construir su gramática con un visitante se formateará como se muestra a continuación, con respecto a la bandera elegida y los posibles alias:

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

La salida será un analizador / lexer con un visitante o sin visitante, respectivamente.

Salida La salida será ExprBaseVisitor.java y ExprVisitor.java para este ejemplo. Estos son los archivos java relevantes para que pueda implementar la funcionalidad de visitante. A menudo es ideal crear una nueva clase y extender ExprBaseVisitor para implementar una nueva funcionalidad de visitante para cada método.

// 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow