Aufgaben
|
Überprüfung
|
1. |
Sind alle benutzten Namen deklariert?
|
2. |
Sind alle benutzten Namen vernünftig verwendet?
|
3. |
Haben alle Operationen vernünftige Argumente?
Typcheck
|
Attributierung |
mit Typinformation für die
Codeerzeugung oder Interpretation
|
|
|
Beispiel
|
class X {
int isEven(int x) {
return
X % 2 == O;
}
}
|
?
|
Dieses Programm enthält mindestens 3 Fehler. Welche?
|
|
|
Beispiel Syntaxbaum
|
Abstrakte Syntax
|
|
data ProgramTree = ProgT [ ClassDef ]
data ClassDef = CDef { className :: String
, superClass :: Maybe String
, interfaces :: [ String ]
, classBody :: ClassBody
}
data ClassBody = CBody { methods :: [ Method ]
, fields :: [ Field ]
}
data Method = ...
data Field = ...
|
|
|
Arbeitsweise
|
typische Struktur
|
1. |
rekursiver Durchlauf durch den Programmbaum
möglicherweise mehrfach
|
2. |
Aufbau eines Environments, einer Umgebung, eines Verzeichnisses
für die Beschreibung der vorkommenden Namen
|
3. |
rekursiver Durchlauf für den Typcheck und die Attributierung
|
|
|
Entwurfsmuster
|
Interpretierer, Besucher
|
|
|
Generatoren
|
für die semantische Analyse
|
Beschreibung
|
attributierte Grammatik
|
|
jedem Grammatik-Symbol werden Attribute zugeordnet
|
|
|
abgeleitete Attribute
|
Information wird von einem Knoten zu den Nachfahren transportiert
|
|
|
synthetisierte Attribute
|
Information wird von den Kindern zu den Eltern-Knoten transportiert
|
|
|
Traversierung
|
des Programmbaumes wird erzeugt
|
|
|
|
Generatoren sind nicht so verbreitet, wie für Scanner und Parser
|
|
für kleine Sprachen manchmal ein zu komplexes Werkzeug
|
|
aber im industriellen Einsatz
|