Sök…
Introduktion
Vad är skillnaden mellan en lyssnare och en besökare? Skillnaden mellan lyssnar- och besökarmekanismer är att lyssnarmetoder kallas av det ANTLR-tillhandahållna rullarobjektet, medan besökarmetoder måste gå sina barn med uttryckliga besökssamtal. Att glömma att åberopa besök () på en nods barn innebär att dessa underträd inte får besök. Som besökare har vi möjligheten att gå promenader medan du i lyssnaren bara reagerar på trädvandraren.
Exempel
Grammatiksexempel (Expr.g4)
grammar Expr;
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
| expr ('+'|'-') expr
| INT
| '(' expr ')'
;
NEWLINE : [\r\n]+ ;
INT : [0-9]+ ;
Genererar besökaren
För att generera en besökare eller för att inaktivera en besökare för din grammatik använder du följande flaggor:
-visitor generate parse tree visitor
-no-visitor don't generate parse tree visitor (default)
Kommandolinjen / terminalkommandot för att bygga din grammatik med en besökare kommer att formateras som visas nedan, med avseende på vald flagga och möjliga alias:
java - jar antlr-4.5.3-complete.jar Expr.g4 -visitor
java - jar antlr-4.5.3-complete.jar Expr.g4 -no-visitor
Utgången kommer att vara en parser / lexer med en besökare respektive ingen besökare.
Utgång Output kommer att vara ExprBaseVisitor.java och ExprVisitor.java för detta exempel. Dessa är relevanta java-filer för att implementera besökarfunktioner. Det är ofta idealiskt att skapa en ny klass och utöka ExprBaseVisitor för att implementera ny besökarfunktionalitet för varje metod.
// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow