Uni-GH PBPraktikum 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: 

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: 
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 

Projektbeschreibungen