Aufgaben
|
Überprüfung
|
1. |
Sind alle benutzten Namen deklariert?
|
2. |
Sind alle benutzten Namen sinnvoll verwendet?
|
3. |
Haben alle Operationen sinvolle Argumente?
Typcheck
|
Attributierung |
mit Typinformation für die
Codeerzeugung oder Interpretation
|
| |
Beispiel
|
class X {
int isEven(int x) {
return
X % 2 == O;
}
}
|
?
|
Dieses Java-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
|