Zoeken…


Invoering

Wat is het verschil tussen een luisteraar en een bezoeker? Het verschil tussen luisteraar- en bezoekersmechanismen is dat luisteraarmethoden worden aangeroepen door het door ANTLR geleverde walker-object, terwijl bezoekersmethoden hun kinderen moeten lopen met expliciete bezoekoproepen. Het vergeten van visit () op de kinderen van een knooppunt te gebruiken betekent dat die substructuren niet worden bezocht. In bezoeker hebben we de mogelijkheid om boomwandelingen te maken terwijl je in luisteraar alleen reageert op de boomwandelaar.

Voorbeeld

Grammaticavoorbeeld (Expr.g4)

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

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

Genereren van de bezoeker

Om een bezoeker te genereren, of om een bezoeker voor uw grammatica uit te schakelen, gebruikt u de volgende vlaggen:

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

De opdrachtregel / terminalopdracht om uw grammatica samen met een bezoeker samen te stellen, wordt opgemaakt zoals hieronder getoond, met betrekking tot de gekozen vlag en mogelijke aliassen:

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

De uitvoer is een parser / lexer met respectievelijk een bezoeker of geen bezoeker.

Uitvoer De uitvoer is voor dit voorbeeld ExprBaseVisitor.java en ExprVisitor.java . Dit zijn de relevante Java-bestanden voor u om bezoekersfunctionaliteit te implementeren. Het is vaak ideaal om een nieuwe klasse te maken en de ExprBaseVisitor uit te breiden om nieuwe bezoekersfunctionaliteit voor elke methode te implementeren.

// 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow