"falta de acceso atributo" significa que usted ha hecho referencia a un ámbito de aplicación ($nounPhrase
) en lugar de un atributo de el alcance (como $nounPhrase.text
).
En general, una buena forma de solucionar problemas con los atributos es observar el método del analizador generado para la regla en cuestión.
Por ejemplo, mi primer intento de crear una nueva regla cuando estaba un poco oxidado:
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); };
dio lugar a "atributo desconocido para el nombre completo regla".Así que traté
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
que se traduce en "falta de acceso atributo". Al observar el método del analizador generado, quedó claro lo que tenía que hacer. Si bien hay algunas piezas crípticos, las partes correspondientes a ámbitos (variables) son fáciles de entender:
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
}
Después de mirar el código generado, es fácil ver que la regla fullname
está volviendo instancias de la clase Name
, por lo lo que necesitaba en este caso era simplemente:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
la versión que necesita en su situación puede ser diferente, pero tendrá por lo general será capaz de entenderlo muy fácilmente mirando el código generado.
¿Podría aclarar más, por favor? No estoy seguro de qué es un atributo –