Ü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