Dr. I. Schaefer
Dipl.-Inf. J.-M. Gaillourdet
Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik
Übungsblatt 6: Übersetzer und sprachverarbeitende Werkzeuge (SS 2009)
Hand Out: 25. Mai 2009 Hand In: 8. Juni 2009
Allgemeines zur Abgabe:
• Checken Sie ihren Code ins SVN ein und erzeugen Sie als Abgabe ein Tagabgabe6in ihrem Verzeichnis tags. Dies geht mit dem Kommando:
svn copy https://so...de:2443/svn/Studenten/trunk/09_SS_USW/<<Gruppe>>/trunk/ \ https://so....de:2443/svn/Studenten/trunk/09_SS_USW/<<Gruppe>>/tags/abgabe6/
• Erstellen Sie ein Skriptrun, dass ihren Compiler übersetzt und startet. Als Parameter soll es die Eingabedatei nehmen. Stellen Sie sicher, dass dies wenigstens auf der Tux1 ohne weitere Einstellungen funktioniert.
Allgemeines zu den Aufgaben: Im folgenden wird nur beschrieben was im Erfolgsfall passieren soll. Fehler sollten Sie natürlich ebenfalls behandeln und ausgeben.
Aufgabe 1 Namensanalyse
Die Namensanalyse ordnet jedem Bezeichner seine Deklarationsstelle zu. Implementieren Sie dazu ein Attribut nameResolution, welches auf jedemIdentifierdefiniert ist und die zugehörige Deklarationsstelle liefert. Für Deklarationsstellen fügen wir der Katja-Spezifikation die SorteDeclarationhinzu, s. unten.
Als Hilfestellung definieren Sie sich zunächst ein Attributcontext, welches zu einemIdentifierden nächsten Vater findet, der von der SorteIdentifierContextist.
nameResolutionsoll für Bezeichner inDeclaration-Kontexten genau diese Deklaration zurück liefern. Verwen- den Sie zur Implementierung vonnameResolutiondas entsprechende Switch-Interface. Dieses gibt es auf Termpo- sitionen genauso wie Sie es auf Termen kennen gelernt haben.
Unsere Sprache umfasst momentan noch keine Referenztypen, daher können auch nur statische Methoden und Klas- senattribute definiert werden. Dies ermöglicht es Ihnen erst, die Namensanalyse unabhängig von der Typanalyse zu definieren.
Declaration = FieldOrVarDecl
| MethodDecl
| FormalParameter
| ClassDecl
IdentifierContext = MethodCall
| FieldOrVariableAccess
| Declaration
Aufgabe 2 Typanalyse von Ausdrücken
Für die Typanalyse implementieren Sie ein AttributtypeOf. Es ist auf beliebigenExpressiondefiniert und liefert derenTypezurück. Verwenden SienameResolution, um die Typen von Variablen, statischen Klassenattributen und statischen Methodenaufrufen herauszufinden.
Aufgabe 3 Kontextbedingungen
Um die Überprüfung von MiniJava-Programmen zu vervollständigen müssen Sie noch folgende Kontextbedingungen überprüfen.
• JedeCompilationUnitmuss genau eine KlasseMainmit einer statischen Methodestatic void main() enthalten.
• Jede Methode und jedes Attribut iststatic.
• Es gibt drei Typen von Scopes in MiniJava-Programmen: DieCompilationUnit, jede Klasse und jede Me- thode bilden einen Scope. Pro Scope darf jeder Bezeichner nur einmal deklariert werden.
• Jeder Methodenaufruf hat die korrekte Anzahl an Parametern und jeder aktuelle Parameter hat einen, zum for- malen Parameter, kompatiblen Typ.
• Jede nicht-voidMethode hat mindestens einreturn. Der Typ des Ausdrucks hinter demreturnist kompati- bel zum Rückgabetyp der Methode.
• JedevoidMethode hat nurreturn-Anweisungen ohne Ausdruck.
• Nach einemreturnfolgt keine weitere Anweisung im selben Block.
• Die Bedingungen vonifundwhilehaben den Typboolean.
• Die linke und die rechte Seite einer Anweisung haben kompatible Typen.
• JederExpressionhat einen Typ.
Dies alles soll im AttributcontextCorrect, welches eine CompilationUnit nimmt und ein boolean liefert, überprüft werden.
Zur Realisierung definieren Sie sich weitere Attribute und evtl. weitere Katjasorten. Dokumentieren Sie kurz jedes Attribut und seine Abhängigkeiten in einer separaten Datei.