« manque d'accès d'attribut » signifie que vous avez fait référence à une portée ($nounPhrase
) plutôt qu'un attribut de la portée (comme $nounPhrase.text
).
En général, un bon moyen de résoudre les problèmes liés aux attributs consiste à examiner la méthode de l'analyseur générée pour la règle en question.
Par exemple, ma première tentative de création d'une nouvelle règle quand j'étais un peu rouillé:
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); };
a donné lieu à « attribut inconnu pour la règle fullname ».J'ai donc essayé
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
qui se traduit par "manque accès aux attributs". En regardant la méthode de l'analyseur syntaxique générée, j'ai clairement compris ce que je devais faire. Bien qu'il existe des pièces énigmatiques, les parties pertinentes aux étendues (variables) sont faciles à comprendre:
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
}
Après avoir regardé le code généré, il est facile de voir que la règle fullname
retourne les instances de la classe Name
, donc ce que je avais besoin dans ce cas était tout simplement:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
la version dont vous avez besoin dans votre situation peut être différente, mais vous serez généralement en mesure de le comprendre assez facilement en regardant le code généré.
Pourriez-vous nous éclairer davantage, s'il vous plaît? Je ne suis pas sûr de ce qu'est un attribut –