Praktikum
Sprachimplementierung mit Werkzeugen WS 1996/97
Projekt LEOO (Objekt-orientierte Lernsprache)
Einführung
LEOO ist eine objekt-orientierte Programmiersprache, die sich aufgrund
ihrer klaren und konsequenten Anwendung von OO-Prinzipien insbesondere
als Lernsprache eignet. LEOO verfügt über die meisten OO-Mechanismen,
wie Klassen, Interface-Klassen, Polymorphismus, etc. Absichtlich wurden
die komplizierteren OO-Themen nicht mit in die Sprache aufgenommen, wie
z.B. Mehrfachvererbung, Overloading und ko-/kontravariantes Redefinieren.
Weiterhin werden fortgeschrittene nicht-OO-typische Konzepte, wie z.B.
Genereziät, ebenfalls nicht von LEOO unterstützt.
Beispiel
Das folgende Beipiel demonstiert die Implementierung einer einfachen
Liste in LEOO. Die wichtigen Sprachkonstrukte sind dabei durch blaue Anmerkungen
markiert.
- class List
- baseclass Object Single Inheritance
-
- implements Printable Interface-Klassen
-
- attributes
- firstElement : Element;
- nextElement : Element;
- constructors
- new() begin
- /* nothing to do */
- end;
- destructor
- methods
- add(o : Object) begin
- newElement : Element;
newElement := Element!new(lastElement, null, o); Konstruktor-Aufruf
lastElement.setNext(newElement);
lastElement := newElement;
- if (firstElement=null) then if-Statement
- firstElement = newElement;
- end;
- end;
- remove(o : Object) begin
- elem : Element;
elem := self.find(o);
- if elem!=null then
- elem.getNext().setPrev(elem.getPrev());
elem.getPrev().setNext(elem.getNext());
/* no delete needed */ Garbage-Collection
- end;
- end;
- print(stream : Stream) begin
- elem : Element;
o : Object;
p : Printable; Interface als Var-Typ
elem := firstElement;
- while elem != null do while-Schleife
- o := elem->getObj();
- if (o.isKindOf(Printable)) then Laufzeit-Typinformation
- p ?= o; Downcast Attempt
p.print(stream);
- else
- "<???>".print(stream);
- end;
- elem := elem.getNext();
- end; // while
- end; // method remove
- end; // class List
ELI-Aufgaben
Syntaktische Analyse
LEOO orientiert sich bei der Notation von Bezeichnern, Literalen und
Kommentaren an Vorlagen aus C, Modula und Pascal.
Die Notation von Bezeichnern erfolgt nach Pascal-Syntax, so daß
vordefinierte Eli-Symbole verwendet werden können. Die Notation von
Literalen für Strings und Integer orientiert sich an C, bzw. Pascal.
Auch hier können Eli-Symbole verwendet werden. Die Notation von Fließkommazahlen
setzt vorraus, daß immer mindestens eine Stelle nach dem Komma folgt,
um Konflikte bei der Notation von "Literal.Methode" zu vermeiden.
Kommentare werden wie in C++ notiert, sollen aber geschachtelt werden können.
Hierfür ist die Erstellung eines eigenen Symboles erforderlich.
Gammatik
Namens-Analyse
LEOO verwendet drei voneinander getrennte Namensräme für
die unterschiedliche Scope-Rules gelten:
- Klassennamen sind grundsätzlich global bekannt und daher leicht
mit Algol-Scope Rules analysiert werden
- Attribute, Parameter und lokale Variablen sind ausschließlich
innerhalb einer Klasse, bzw. Methode bekannt und können ebenfalls
mit Algol-Scope Rules zu analysieren
- Methoden sind innherhalb der Klasse und allen abgeleiteten Klassen
bekannt und können außerdem mittels "Object.Method(...)"
angesprochen werden. Dies erfordert die Verwendung weiterer Module zur
Namensanalyse aus dem Eli-Repertoire.
Typ-Analyse
Die Typ-Analyse stellt sich als schwierigste Aufgabe des Projektes
dar. Zur Realisierung der Vererbung wie sie LEOO erfordert müssen
einige Teile ohne größere Eli-Unterstützung durch Module
selbst entworfen werden. Andere Teile können durch ähnliche Module
und Konzepte abgedeckt werden (z.B. Interface-Klassen durch Multiple Inheritance).
Zieltexterzeugung
Als Zieltext werden mehrere Dateien erzeugt:
- Dateien mit statischen Informationen zum Programmtext, getrennt für
Klassen und Interface-Klassen. Diese Dateien im selbstentworfenen Format
werden von der getrennt entwickelten LEOO-Oberfläche verwendet um
Informationen über den Quelltext graphisch aufbereitet darzustellen.
- Dateien mit C++ Quelltext enthalten neben dem eigentlichen LEOO-Programm
zusätzliche Anweisungen zur Steuerung der LEOO-Oberfläche mit
dynamischen Laufzeit-Informationen (z.B. Methodenaufruf, Objekt-Instanziierung,
...).
LEOO-Klassen und -Interface-Klassen werden in C++ Klassen überführt.
Außer bei Attributen bleiben alle Bezeichner dabei erhalten. Attributnamen
werden aufgrund der unterschiedlichen Vererbung konsistent umbenannt.
Zur Erzeugung des Quelltextes werden entsprechende PTG-Muster entworfen
und in jeweils zu den Eingabedateien passende Ausgabedateien (neue Endung)
ausgegeben.
Referenzen
Homepage
der Projektgruppe Objekt-Orientierte Programmiersprachen