Szukaj…
Wprowadzenie
Jaka jest różnica między słuchaczem a gościem? Różnica między mechanizmem nasłuchującym a mechanizmem odwiedzającego polega na tym, że metody detektora wywoływane są przez obiekt walker dostarczony przez ANTLR, podczas gdy metody odwiedzające muszą prowadzić swoje dzieci za pomocą jawnych wywołań wizyty. Zapomnienie o wywołaniu metody visit () na dzieciach węzła oznacza, że te poddrzewa nie są odwiedzane. U gościa mamy możliwość chodzenia po drzewie, podczas gdy słuchacz reaguje tylko na chodzika.
Przykład
Przykład gramatyki (np. G4)
grammar Expr;
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
| expr ('+'|'-') expr
| INT
| '(' expr ')'
;
NEWLINE : [\r\n]+ ;
INT : [0-9]+ ;
Generowanie gościa
Aby wygenerować gościa lub wyłączyć go dla gramatyki, użyj następujących flag:
-visitor generate parse tree visitor
-no-visitor don't generate parse tree visitor (default)
Polecenie wiersza poleceń / terminalu służące do budowania gramatyki z gościem zostanie sformatowane w sposób pokazany poniżej, w odniesieniu do wybranej flagi i możliwych aliasów:
java - jar antlr-4.5.3-complete.jar Expr.g4 -visitor
java - jar antlr-4.5.3-complete.jar Expr.g4 -no-visitor
Wynikiem będzie odpowiednio parser / leksyk z gościem lub bez gościa.
Dane wyjściowe Dane wyjściowe będą ExprBaseVisitor.java i ExprVisitor.java dla tego przykładu. Są to odpowiednie pliki Java do wdrożenia funkcji gościa. Często idealnie jest stworzyć nową klasę i rozszerzyć ExprBaseVisitor, aby zaimplementować nową funkcjonalność dla każdej metody.
// 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow