Suche…


Einführung

Was ist der Unterschied zwischen einem Zuhörer und einem Besucher? Der Unterschied zwischen Listener- und Besuchermechanismen besteht darin, dass Listenermethoden vom von ANTLR bereitgestellten Walker-Objekt aufgerufen werden, während Besuchermethoden ihren Kindern explizite Besuchsaufrufe ausführen müssen. Wenn Sie vergessen, visit () für die untergeordneten Elemente eines Knotens aufzurufen, werden diese Unterbäume nicht besucht. In besucher haben wir die möglichkeit, baum zu gehen, während Sie im hörer nur auf den baumläufer reagieren.

Beispiel

Grammatikbeispiel (Beispiel 4)

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

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

Besucher generieren

Um einen Besucher zu generieren oder um einen Besucher für Ihre Grammatik zu deaktivieren, verwenden Sie die folgenden Flags:

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

Der Kommandozeilen- / Terminalbefehl zum Erstellen Ihrer Grammatik mit einem Besucher wird wie unten gezeigt in Bezug auf das ausgewählte Flag und mögliche Aliasnamen formatiert:

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

Die Ausgabe wird ein Parser / Lexer mit einem Besucher bzw. keinem Besucher sein.

Ausgabe Die Ausgabe ist in diesem Beispiel ExprBaseVisitor.java und ExprVisitor.java . Dies sind die relevanten Java-Dateien für die Implementierung der Besucherfunktionalität. Es ist oft ideal, eine neue Klasse zu erstellen und den ExprBaseVisitor zu erweitern, um neue Besucherfunktionen für jede Methode zu implementieren.

// 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow