Ricerca…


introduzione

Qual è la differenza tra un ascoltatore e un visitatore? La differenza tra i meccanismi listener e visitor è che i metodi listener vengono chiamati dall'oggetto walker fornito da ANTLR, mentre i metodi visitor devono accompagnare i propri figli con chiamate di visita esplicite. Dimenticare invocare visit () sui figli di un nodo significa che quei sottotitoli non vengono visitati. Nel visitatore abbiamo la capacità di camminare sugli alberi mentre nell'ascoltatore stai reagendo solo al tree walker.

Esempio

Esempio di grammatica (Expr.g4)

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

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

Generare il visitatore

Per generare un visitatore, o per disabilitare un visitatore per la tua grammatica, usi i seguenti flag:

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

Il comando da riga di comando / terminale per costruire la tua grammatica con un visitatore verrà formattato come mostrato di seguito, rispetto al flag scelto e ai possibili alias:

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

L'output sarà un parser / lexer con un visitatore o nessun visitatore rispettivamente.

Output L'output sarà ExprBaseVisitor.java e ExprVisitor.java per questo esempio. Questi sono i file java rilevanti per implementare la funzionalità dei visitatori. Spesso è l'ideale per creare una nuova classe ed estendere ExprBaseVisitor per implementare nuove funzionalità per i visitatori per ciascun metodo.

// 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow