サーチ…
前書き
リスナーと訪問者の違いは何ですか?リスナーと訪問者のメカニズムの違いは、ANTLRが提供するウォーカーオブジェクトによって呼び出されるリスナメソッドですが、ビジターメソッドは明示的な訪問呼び出しで子どもを歩かなければなりません。ノードの子ノードでvisit()を呼び出すことを忘れると、そのサブツリーは訪問されません。訪問者では、聴取者はツリーウォーカーに反応するだけで、歩くことができます。
例
文法例(Expr.g4)
grammar Expr;
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
| expr ('+'|'-') expr
| INT
| '(' expr ')'
;
NEWLINE : [\r\n]+ ;
INT : [0-9]+ ;
ビジターの生成
ビジターを生成する、またはビジターの文法を無効にするには、次のフラグを使用します。
-visitor generate parse tree visitor
-no-visitor don't generate parse tree visitor (default)
訪問者との文法を構築するためのコマンドライン/ターミナルコマンドは、選択したフラグと可能なエイリアスに関して次のように書式設定されます。
java - jar antlr-4.5.3-complete.jar Expr.g4 -visitor
java - jar antlr-4.5.3-complete.jar Expr.g4 -no-visitor
出力は、訪問者または訪問者のないパーサ/レクサーになります。
出力この例では、出力はExprBaseVisitor.javaおよびExprVisitor.javaになります。これらは訪問者の機能を実装するための関連するJavaファイルです。新しいクラスを作成し、ExprBaseVisitorを拡張してメソッドごとに新しい訪問者機能を実装するのが理想的です。
// 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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow