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:
Bei einem Bottom-up-Verfahren bei jedem erfolgreichen Reduktionsschritt
Bei einem Top-down-Verfahren bei jedem erkannten Symbol
Beim Durchlaufen eines Syntaxbaumes bei jedem Knoten, wenn der linke Teilbaum durchlaufen ist
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:
Führen der Namensliste
Überprüfung der Eigenschaften von bezeichneten Sprachelementen (zB. linke Seite einer Zuweisungsanweisung muss eine Variable sein)
Generieren von Zwischencode
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.