Semantische Aktionen


Semantische Aktionen werden aufgerufen, um semantische Prüfungen vorzunehmen und Zwischencode zu erzeugen. Sie können direkt vom Parser aufgerufen werden (sytaxgesteuerter Compiler) oder als gesonderter Pass in Auswertung des Syntaxbaumes, den der Parser erzeugt hat (Mehrpasscompiler).

Ergänzt man die Regeln einer Kontextfreien Grammatik um Aktionen, die in Form von Code in die rechten Seiten der Regeln „eingestreut werden“, so spricht man von einem Übersetzungsschema (Aho/Sethi/Ullmann).


Somit besteht ein Regelteil eines yacc-Quelltextes aus aus solchen Schemata.


Beispiel:

statement:   T_BEGIN statementList T_END;
        |   T_Ident T_ERG {AassLeft($1);} expression {Aass();};   
     |    T_IF condition T_THEN {Aif1();} statement  {Aif2();}; 
      |    T_WHILE {while1();} condition T_DO {Awhile2();} statement {Awhile();};
        |    T_CALL T_Ident           {Acall($2);};
      |    '?' T_Ident          {Ain($2);};
        |    '!'expression       {AstOutExpr();};

Eine Aktion wird ausgeführt, wenn die rechte Seite der Regel bis zu der Stelle, an der die Aktion angegeben ist erfolgreich durchlaufen wurde.

Semantikaktionen können ausgeführt werden:


In dem Modellcompiler werden die sematischen Aktionen von dem Parseralgorithmus (pars) aufgerufen, wenn der entsprechende Bogen formal akzeptiert worden ist und dem Bogen eine Aktion zugeordnet ist.

Die Aufgaben der semantischen Aktionen umfassen:


Alle Listen und Kellerspeicher der Semantikroutinen werden mit Hilfe von Listen implementiert. Im Modellcompiler kommt eine doppelt verkettete Ringliste zum Einsatz. Instanzen dieser Liste werden im Compiler für verschiedenste Zwecke verwendet. Alle Listen und Kellerspeicher werden über diese Listentechnik realisiert.

Auch eine einfach verkettete Liste, die das Verhalten eines Kellerspeichers nachbildet könnte zum Einsatz kommen. Bei einer solchen Liste wird dann immer am Listenkopf ein- und ausgekettet.

Im einzelnen werden die Semantikroutinen im Zusammenhang mit der Codegenerierung betrachtet.