2017-06-22 3 views
1

Ich habe eine Parser-Regel mit alternativen Bezeichnungen.
Ich möchte ein Besucher Methode für, wenn eine der Markierungen sind gut besucht implementieren:Besucher-Methode für alle Etiketten

someRule 
    : 'a' #aLabel 
    | 'b' #bLabel 
    | 'c' #cLabel 
    ; 

Und ich brauche wie dies einige Methode:

T visitSomeRule(SomeRuleContext ctx) 

Antwort

1

Mit Labels wie deins Sie am Ende werden mit etwas wie:

override VisitAlabel(aLabelRuleContext) {....} 
override VisitBlabel(bLabelRuleContext) {....} 
override VisitClabel(cLabelRuleContext) {....} 

jedoch das Hinzufügen der alternativen Etiketten verursacht ANTLR4 nicht den generischen Kontext Klasse erzeugen SomeRuleContext in Ihrem Beispiel oben. Es ist nicht möglich, eine Mischung aus beidem zu haben. Das Eine oder das Andere. Wenn Sie Zugriff auf SomeRuleContext wollen, dann müssen Sie die Etiketten entfernen und innerhalb des Handlers für die alternativen Kontexten prüfen SomeRuleContext.

Meine Quelle: Erfahrung mit diesem und The Definitive ANTLR4 Referenz von Terence Parr, Seite 120

+0

Vielleicht könnte ich die Besuchsmethode überschreiben und den Typ des Arguments überprüfen? Das scheint jedoch eine hackige Art zu sein. – Midnightas

+0

Ja, darauf habe ich mich in meiner Antwort bezogen. Wenn Sie Terence Parrs Buch über die alternativen Bezeichnungen lesen, ist es klar, dass diese Funktion hinzugefügt wurde, um "präzisere" Kontexte durch gezieltere Unterklassen zu geben. Und ich habe festgestellt, dass ich die Verwendung von Etiketten für die meisten meiner Arbeiten bevorzuge. Aber wenn Sie diesen Kontext auf höherer Ebene wirklich brauchen, können Sie sicher durch seine Children iterieren, ihre Typen untersuchen und individuell darauf reagieren. Es ist möglich, und ich habe es getan. Bis ich von den alternativen Labels erfuhr. ;) – TomServo

Verwandte Themen