KLX könnte für Komputer Language X stehen; eine andere Erklärung
geht von der amerikanischen Aussprache aus:
X wie ecks, und KLX wie Klecks.
Die Sprache KLX
In dieser Aufgabe wollen wir eine Sprache entwickeln und implementieren,
mit der einfache (und vielleicht auch komplizierte) Farbflächen also Kleckse
programmiert werden können. Diese Sprache nennen wir KLX.
Ein einfaches "Programm" in dieser Sprache könnte so aussehen:
/* ein primitiver KLX */
Rechteck;
| |
Ein etwas komplizierteres etwa so:
// Die Variablen x und y
x = 200;
y = 200;
// ein Klecks, der Parameter Schleifen und anderes
// illustriert
procedure kr(w,l)
{ [x,y] Kreis;
[x,y] rgb(1,1,0) Sektor Winkel: w/2;
for i=w to 359 step w do
[x,y] < i blau Sektor Winkel: w/2;
[150+x,y-100] %200 Rechteck;
[200+x,y-50]
{ for i=1 to l step 1 do
%100/i < i*-20 [0, 50] rgb(1, i*1/l,0) Rechteck ;
}
}
// derselbe Klecks
// mit verschiedenen Parametern in verschiedener Größe
kr(45,10);
%20 kr(90,3);
// Ein rekursiver Klecks
procedure q(n, i)
{ if 0<n then {
rgb(i,1,i*0.5) Rechteck;
if 0=i then j=1; else j=0;
%50 { [0,100] q(n-1,i);
[100,100] q(n-1,j);
[100,0] q(n-1,i);
}
}
}
// und so sieht der rekursive Klecks dann aus:
[100,400] %200 q(10,1);
| |
Diese Beispiele vermitteln etwas von der Intention der Sprache KLX.
- Es gibt primitive Kleckse (Rechteck, Kreis, Sektor).
- Kleckse können verschoben ([10,200]) werden.
- Kleckse können skaliert (%20) werden.
- Kleckse können rotiert (< 90) werden.
- Kleckse können gefärbt (blau, rot, rgb(...)) werden.
- Es gibt zusammengesetzte Kleckse ({}).
- Es gibt Variablen, Prozeduren und Kontrollstrukturen.
- Kommentare im C++ Stil sind möglich.
Die Einzelheiten sind dabei eher zufällig. Man könnte genau so gut auch
Englisch, Russisch oder Spanisch nehmen, sich an Python oder FORTRAN
orientieren und die Kleckse auch anders formulieren.
Hauptsache es ist klar, was gemeint ist, d.h. wir haben lesbare Programme.
Es wird daher hier ausdrücklich auf eine Spezifikation der Sprache KLX
verzichtet. Die Spezifikation der Sprache ist Teil ihrer Aufgabe und Sie
sind dabei ganz frei zu tun und zu lassen was Sie für richtig erachten.
Trotzdem sei eine Warnung angebracht. Ich habe mir natürlich bei obigen
Beispielen einiges gedacht, und wenn Sie eigene Wege gehen werden Sie
sicher auch auf eigene Schwierigkeiten treffen,
mit denen Sie vorher nicht gerechnet haben.
Es sei deshalb empfohlen einmal mit einer Sprache nach obigem
Muster zu beginnen und dann eigene Ideen experimentell zu entwickeln.
Aufgabenstellung Teil 1
Analysieren Sie die obigen KLX Programme und identifizieren Sie die verschiedenen
Token. Schreiben Sie einen lexical Analyser mit (f)lex.
Aufgabenstellung Teil 2
Analysieren Sie die obigen KLX Programme und identifizieren Sie die verschiedenen
Strukturen.
Schreiben sie eine yacc Grammatik, die die Sprache KLX erkennt.
Aufgabenstellung Teil 3
Was nützt die schönste Sprache, wenn sie niemand versteht!
Wir brauchen also einen Übersetzer, der Programme in der Sprache KLX übersetzt
in eine Sprache, die der Computer versteht.
Üblicherweise werden deshalb Programme in die Maschinensprache übersetzt.
In unserem Fall ist die Maschinensprache eines Intel 8086 eher ungeeignet, weil
ein Intel 8086 nicht über die Fähigkeit verfügt Graphik auszugeben. Wir wählen daher
die virtuelle Maschine eines PostScript Interpreters und übersetzen KLX nach
PostScript. Ein beliebiger PostScript Viewer oder ein PostScript fähiger Drucker
kann dann benutzt werden um das Programm auszuführen.
Die obigen Beispiele sind deshalb gleich rechts mit einem Bild versehen
auf dem man die Übersetzung sehen kann. Hinter dem Bild steht ein Link
auf den übersetzten Code (PostScript), den man sich einerseits
in einem Texteditor oder aber auch in einem PostScript Viewer
anschauen kann.
Die dritte Aufgabe ist also: Generieren Sie PostScript Code.
Beschränken Sie sich vorerst auf ganz einfache KLX Programme.
Wir werden den KLX Übersetzer im Laufe des Praktikums schrittweise
erarbeiten.