「missing attribute access」とは、スコープの属性( など$nounPhrase
) ではなく、スコープ ( )を参照したことを意味します。$nounPhrase.text
一般に、属性に関する問題をトラブルシューティングする良い方法は、問題のルールに対して生成されたパーサー メソッドを調べることです。
たとえば、少し錆びていたときに新しいルールを作成しようとした最初の試みは次のとおりです。
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a.value); names.add($b.value); };
「ルールフルネームの不明な属性」という結果になりました。だから私は試しました
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
その結果、「欠落した属性アクセス」が発生します。生成されたパーサー メソッドを見ると、何をする必要があるかが明確になりました。不可解な部分もありますが、スコープ (変数) に関連する部分は簡単に理解できます。
public final List<Name> multiple_names() throws RecognitionException {
List<Name> names = null; // based on "returns" clause of rule definition
Name a = null; // based on scopes declared in rule definition
Name b = null; // based on scopes declared in rule definition
names = new ArrayList<Name>(4); // snippet inserted from `@init` block
try {
pushFollow(FOLLOW_fullname_in_multiple_names42);
a=fullname();
state._fsp--;
match(input,189,FOLLOW_189_in_multiple_names44);
pushFollow(FOLLOW_fullname_in_multiple_names48);
b=fullname();
state._fsp--;
names.add($a); names.add($b);// code inserted from {...} block
}
catch (RecognitionException re) {
reportError(re);
recover(input,re);
}
finally {
// do for sure before leaving
}
return names; // based on "returns" clause of rule definition
}
生成されたコードを見ると、ルールがクラスfullname
のインスタンスを返していることが簡単にわかるので、この場合に必要だったのは次のとおりです。Name
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
状況に応じて必要なバージョンは異なる場合がありますが、通常は、生成されたコードを確認することで簡単に判断できます。