Recherche…


Introduction

Quelle est la différence entre un auditeur et un visiteur? La différence entre les mécanismes d'écoute et de visiteur est que les méthodes d'écoute sont appelées par l'objet walker fourni par ANTLR, tandis que les méthodes visiteur doivent guider leurs enfants avec des appels de visite explicites. Oublier d'appeler visit () sur les enfants d'un nœud signifie que ces sous-arbres ne sont pas visités. En visiteur, nous avons la possibilité de marcher dans les arbres, alors qu'en écoute, vous ne faites que réagir au déambulateur.

Exemple

Exemple de grammaire (Expr.g4)

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

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

Générer le visiteur

Pour générer un visiteur ou désactiver un visiteur pour votre grammaire, utilisez les indicateurs suivants:

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

La commande commandline / terminal pour construire votre grammaire avec un visiteur sera formatée comme indiqué ci-dessous, en ce qui concerne les alias choisis et les alias possibles:

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

La sortie sera un analyseur / lexer avec un visiteur ou aucun visiteur, respectivement.

Sortie La sortie sera ExprBaseVisitor.java et ExprVisitor.java pour cet exemple. Ce sont les fichiers java pertinents pour vous permettre de mettre en œuvre les fonctionnalités des visiteurs. Il est souvent idéal de créer une nouvelle classe et d'étendre ExprBaseVisitor pour implémenter de nouvelles fonctionnalités pour chaque méthode.

// 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow