Regeln: block, outer_block

Top  Previous  Next

Beispiele > Guard > Regeln: block, outer_block

 

Die outer_block-Produktion beschreibt den Funktionskörper.

Der Code einer C++-Funktion kann sich über viele Zeilen erstrecken und kompliziert verschachtelte Strukturen enthalten. Für den Zweck des guard-Projekts ist dies irrelevant. Wichtig ist nur die Einfügepositionen für CGuard (s.o.) zu finden.

Die Idee ist, dass sich in C++ aller Code zwischen geschweiften Klammern befindet und dass es zu jeder öffnenden eine schließende Klammer geben muss. Ein solcher Block ist daher wie folgt zu beschreiben:

 

"{"

(

block

| SKIP

)*

"}"

 

Innerhalb des geschweiften Klammerpaares befindet sich eine Abfolge von Code und Unter-Blöcken. Ein Funktionskörper unterscheidet sich in nichts von einem solchen Block außer, dass er der äußerste Block der Funktion ist. Die Position nach seiner öffnenden Klammer und vor seiner schließenden Klammer sind also genau die gesuchten Einfügepositionen. Hier werden die beiden Funktionen print_at_enter und print_at_exit aufgerufen, die dazu dienen die gewünschten guard-Funktionen in die Ausgabe zu schreiben.

 

 

"{"

{{ print_at_enter(xState); }}

(

block   {{ out << xState.lp_copy(); }}

| SKIP    {{ out << xState.copy(); }}

)*

"}"

{{ print_at_exit(xState); }}

 

 

Achtung:

Die Projekt-Option zum Testen aller literaler Token muss abgeschaltet sein, da sonst möglicherweise einem literalen Token, das eigentlich nur in anderen Produktionen des Projekts gebraucht wird, hier der Vorzug vor einer SKIP-Erkennung gegeben wird, wenn es innerhalb eines Blocks vorkommt.

 

Die Funktionen print_at_enter und print_at_exit sind auf der Seite für die Klassenelemente definiert:

 

print_at_enter ::=

{{

out << xState.copy() // {

     << "\n  CGuard G(\""

     << m_sScope

     << "\",\""

     << m_sName

     << "\");\n";

}}

 

Hier werden die Variablen m_sScope und m_sName zur Konstruktione eines "Wächters" benutzt.

 

print_at_exit ::=

{{

out << "\n  G.stop();\n}";

m_sName.clear();

m_sScope.clear();

}}

 

Hier wird der Inhalt der Variablen m_sScope und m_sName glöscht.

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English