2016-10-20 3 views
0

In dem Buch The Definitive ANTLR4 Referenz gibt es zwei Sätze, den Zugang von Regel über und Token Attribute von eingebetteten AktionenANTLR4 Regel und Token-Attribute in eingebetteten Aktionen

Phrase 1 (Seite 272 Token-Attribut): $ T und $ lle Token-Objekte für Token-Name T und Token-Label l auswerten. $ ll ergibt List für list label ll.

Satz 2 (Seite 273 Parser-Regelattribute): $ r und $ rl werten ParserRuleContext-Objekte vom Typ RContext für den Regelnamen r und die Regelbezeichnung rl aus. $ Rll wertet für Regelliste Label rll

Ich verstehe nicht zur Liste, was die Teile

und

„$ rll auswertet "$ ll für Liste Etikett ll zur Liste auswertet" Liste für Regellistenbezeichnung rll "

mean.

Können Sie bitte erklären, indem Sie mir ein Beispiel geben und mir sagen, wie kann ich es benutzen?

Vielen Dank im Voraus

+0

Ich bin mir nicht ganz sicher, aber in einigen Fällen werden die Schließoperatoren (+, *) auf Symbole im RHS einer Regel angewendet. Das Nettoergebnis ist der sukzessive Aufruf der Regeln für die Symbole (terminal oder non-terminals), bei denen die Schließung angewendet wird. Um ParserRuleContext- oder Token-Objekte zu sammeln, die vom Closure generiert werden, wird der Operator "+ =" angewendet, um die instanziierten Objekte einer beschrifteten Liste zuzuweisen, auf die später über die $ -Label-Notation auf die Objekte zugegriffen werden kann –

Antwort

0

Ja, das ist ein bisschen in dem Buch irreführend. Was gemeint ist, sind Token-Listen. Ich nehme an, es gab ein Beispiel, das ll enthielt, das es später im gedruckten Buch nicht schaffte.

können Sie haben so etwas wie:

list: ll += ID (ll += ID)*; 

Notiere die += die ANTLR auf eine Liste von Tokens übersetzt (anstelle eines einzelnen Token für die einfache Zuordnung). Sie können dann wie jede andere Liste in Ihrer Sprache darauf zugreifen (z. B. $ll[1].text für den Text des zweiten Elements).

Beachten Sie, dass es einen anderen Fall, in dem ANTLR automatisch eine Liste erzeugt, nämlich dann, wenn Sie ein Token Referenz/mehrere Male in einem alt regieren:

list: ID COMMA ID; 

Wenn Sie jetzt ID wollen in Ihrem Hörer zugreifen werden Sie Sehen Sie, dass es tatsächlich eine Liste gibt, so dass Sie auf alle Vorkommen zugreifen können.