1

ビジターによって ANTLR4 解析ツリーを処理するとき、ルール ノードが属する親ルール ノードを知る必要がある場合があります。のオンライン API ドキュメントにはParserRuleContext、オブジェクトが表すルールの名前を返すことができるメソッド/フィールドが見つかりません。ParserRuleContextルール名がそのサブクラス名の一部であることはわかっています。たとえば、function_definitionルール ノードはクラスFunction_definitionContextです。しかし、クラス名を調べるには、Java リフレクションを使用Contextし、最後に手動で文字列をストライプ化する必要があります。

ParserRuleContextオブジェクトが表すルール名を取得する簡単な方法はありますか?

親ルール ノードの名前を照会することは一般的な要件です。たとえば、C++ 文法を処理する場合、C++ クラス宣言は、グローバル スコープ、関数定義、または別のクラス宣言に含めることができます。これは、ルール ノードを,またはルール ノードclass_declarationの下にネストできることを意味します。の下にあるノードだけを分離したい場合は、親ノードを調べて、またはでないことを確認する必要があります。global_scopefunction_definitionclass_declarationclass_declarationglobal_scopefunction_definitionclass_declaration

4

1 に答える 1

5

からルール名をParserRuleContext文字列として取得するには、次のようにします。

String[] ruleNames = parser.getRuleNames();
String ruleName = ruleNames[parserRuleContext.getRuleIndex()];

ルール インデックスを生成された定数と比較することもできます。

boolean isClassDeclaration =
    parserRuleContext.getRuleIndex() == MyParser.RULE_class_declaration;
于 2013-05-27T18:15:13.157 に答える