Übergangsaktion |
Top Previous Next |
Skripte > Produktionen > Aktionen > Übergangsaktion
Neben den semantischen Aktionen gibt es auch eine Art sehr spezieller "syntaktischer" Aktionen. Eine Übergangsaktion wird ausgeführt, nachdem ein Token akzeptiert wurde und bevor das nächste ermittelt wurde. Dies ist der ideale Zeitpunkt zur Einfügung neuer dynamischer Token mit AddToken, da das neue Token dann bereits vor der Ermittlung des nächsten Tokens zur Verfügung steht. Übergangsaktionen können auch nötig sein, damit sich eine Produktion bei ihrer Verwendung zur Vorausschau im Text genauso verhält, wie sonst. Ein abweichendes Verhalten kann entstehen, wenn während des Parsens neue dynamische Token erzeugt werden, oder wenn der Textbereich geändert wird. Wenn eine solche Änderung als Übergangsaktion ausgeführt wird, wird sie temporär auch während der Vorausschau ausgeführt. Dennoch bleiben die Menge der dynamischen Token und der Textbereich vor und nach Ausführung der Vorausschau unverändert.
Als Übergangsaktionen kommen vor allem die Funktionen AddToken, PushScope und PopScope in Betracht. Als Übergangsaktionen werden sie ausgeführt, wenn sie verbunden mit einem Punkt an den Ausdruck für ein Token angehängt werden.
Beispiele:
ID.AddToken(xState.str(), "CLASS") ID[n].AddToken(xState.str(), "CLASS") ID[n].AddToken(xState.str(), "CLASS", "NewScope").PushScope("NewScope");
Es ist nicht möglich für ein Token eine Übergangsaktion zu definieren, wenn ihm auch eine "normale" Aktion zugewiesen ist.
Bei der Generierung von C++-Code wird die Aktion nur kopiert, d.h. es wird z.B. keine automatische Anpassung an den Zeichentyp vorgenommen.
Eine interessante Anwendung ist die Erkennung von Konstruktoren von C++-Klassen. Solche Konstruktoren werden dadurch gekennzeichnet, dass derselbe Bezeichner einmal vor und einmal nach zwei Doppelpunkten steht, z.B. CParser::CParser. Dass es sich um denselben Bezeichner handelt kann normalerweise leicht durch semantischen Code festgestellt werden. Solcher Code wird aber bei einer Vorausschau nicht ausgeführt. Hier kann man sich dadurch behelfen dass man ein Platzhalter-Token "CLASS" definiert und ihm den Bezeichner bei seiner ersten Erkennung hinzufügt. Das zweite Vorkommen wird dann durch das CLASS-Token erkannt.
IsScoped ::= ID "::" ID
IsClass ::= ID.AddToken(xState.str(), "CLASS") "::" CLASS
IF(IsScoped()) IF(IsClass()) ID.AddToken(xState.str(), "CLASS") "::" CLASS {{out << "class found"; }} ELSE ID "::" ID {{out << "member function found"; }} END ELSE ID {{out << "identifier found"; }} END
|
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |