Ogólnie rzecz biorąc, dobrym sposobem rozwiązywania problemów z atrybutami jest analiza wygenerowanej metody analizowania składni dla danej reguły.
Na przykład, moja pierwsza próba stworzenia nowej reguły, kiedy byłem trochę zardzewiały:
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); };
spowodowało „nieznanego atrybutu dla reguły FULLNAME”.Dlatego starałem
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
co skutkuje "brakuje dostępu atrybutu". Patrząc na wygenerowaną metodę analizatora składni, wyjaśniono, co muszę zrobić. Chociaż istnieją pewne tajemnicze fragmenty, części dotyczące zakresem produktów (zmiennych) są łatwo zrozumiałe:
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
}
Po zapoznaniu się z wygenerowanego kodu, to łatwo zauważyć, że zasada fullname
wraca instancje klasy Name
, więc co potrzebne w tym przypadku po prostu:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
wersja trzeba w danej sytuacji mogą być różne, ale generalnie będziesz w stanie zrozumieć to dość łatwo, patrząc na wygenerowanego kodu.
Czy mógłbyś wyjaśnić dalej, proszę? Nie jestem pewien, co to jest atrybut –