"mancante accesso attributo" significa che hai fatto riferimento un ambito ($nounPhrase
), piuttosto che un attributo del il campo di applicazione (come ad esempio $nounPhrase.text
).
In generale, un buon metodo per risolvere i problemi con gli attributi consiste nell'esaminare il metodo parser generato per la regola in questione.
Ad esempio, il mio primo tentativo di creare una nuova regola, quando ero un po 'arrugginito:
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); };
provocato "attributo sconosciuto per la regola fullname".Così ho provato
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
che si traduce in "manca l'accesso all'attributo". Guardando il metodo del parser generato, ho chiarito cosa dovevo fare comunque. Mentre ci sono alcuni pezzi criptici, alle parti pertinenti a raggi (variabili) sono facilmente comprensibili:
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
}
Dopo aver guardato il codice generato, è facile vedere che la regola fullname
sta tornando istanze della classe Name
, così quello che mi serviva in questo caso era semplice:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
la versione è necessario nella vostra situazione potrebbe essere diversa, ma sarete generalmente in grado di capirlo abbastanza facilmente guardando il codice generato.
Potresti chiarire ulteriormente, per favore? Non sono sicuro di cosa sia un attributo –