„fehlendes Attribut access“ bedeutet, dass Sie einen Bereich verwiesen haben ($nounPhrase
), anstatt ein Attribut den Rahmen (wie $nounPhrase.text
).
Im Allgemeinen ist eine gute Möglichkeit, Probleme mit Attributen zu beheben ist in der generierten Parser-Methode für die betreffende Regel zu suchen.
Zum Beispiel ist mein erster Versuch bei Erstellen eine neue Regel, wenn ich ein wenig rostig war:
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); };
Folge „unbekanntes Attribut für Regel Fullnamen“.Also habe ich versucht
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
was dazu führt, "Attribut Zugriff fehlt". Ein Blick auf die generierte Parser-Methode machte deutlich, was ich tun musste. Zwar gibt es einige kryptische Stücke sind, werden die relevanten Teile Bereiche (Variablen) leicht zu verstehen:
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
}
Nachdem bei den generierten Code suchen, ist es leicht zu sehen, dass die fullname
Regel Instanzen der Name
Klasse zurückkehrt, so was ich in diesem Fall brauchte, war einfach:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };
die Version, die Sie in Ihrer Situation benötigen kann unterschiedlich sein, aber Sie werden es in der Regel der Lage sein, ziemlich leicht, herauszufinden, um den generierten Code suchen.
Könnten Sie bitte noch etwas erläutern? Ich bin mir nicht sicher, was ein Attribut ist –