Compiler ZRa in Scheme+Turtle
ZRa sei die Sprache eines Zeichenroboters mit folgender Definition.
G = (N, T, P, s)
N = {Programm, Anweisungen, Anweisung, Zahl, Ziffer-ab-1, Ziffer, Zahl0, Farbwert, Status}
T = {WH, [, ], FARBE, RE, STIFT, VW, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, gelb, blau,
gruen, rot, schwarz, weiss, oben, radiert, schreibt, unten}
P = {
Programm -> Anweisungen
Anweisungen -> Anweisung Anweisungen
| EPSILON
Anweisung -> WH Zahl [ Anweisungen ]
| FARBE Farbwert
| RE Zahl
| STIFT Status
| VW Zahl
Zahl -> Ziffer | Ziffer-ab-1 Zahl0
Ziffer-ab-1 -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Ziffer -> 0 | Ziffer-ab-1
Zahl0 -> Ziffer | Ziffer Zahl0
Farbwert -> blau | gruen | rot | schwarz | weiss | gelb
Status -> oben | radiert | schreibt | unten
}
s = ProgrammZur Konstruktion eines Parsers reduzieren wir diese Grammatik um die syntaktischen Einheiten, die vom Scanner analysiert werden. Dadurch werden die Nichtterminale Zahl, Farbwert und Status zu Terminalen. Zahl0 und Ziffer-ab-1 entfallen.
G = (N, T, P, s)
N = {Programm, Anweisungen, Anweisung}
T = {WH, Zahl, [, ], FARBE, Farbwert, RE, STIFT, Status, VW}
P = {
Programm -> Anweisungen
Anweisungen -> Anweisung Anweisungen
| EPSILON
Anweisung -> WH Zahl [ Anweisungen ]
| FARBE Farbwert
| RE Zahl
| STIFT Status
| VW Zahl
}
s = ProgrammWir verwenden VCC, um einen Compiler zu beschreiben und zu generieren (Java, LALR(1)), der je ein ZRa-Programm nimmt und das zugehörige Scheme+Turtle-Programm erzeugt.
Beispiel: Das folgende ZRaProgramm
FARBE rot WH 18 [ WH 4 [ VW 50 RE 90 ] RE 20 ] STIFT radiert WH 18 [ WH 4 [ VW 50 RE 90 ] RE 20 ] STIFT schreibt FARBE blau WH 18 [ WH 4 [ VW 50 RE 90 ] RE 20 ]
übersetzt der ZRa2Turtle-Compiler in folgenden Zielcode:
<eval> (clear canvas) (pencolor turtle 255 0 0)(do ((i 1 (+ i 1)))((> i 18) 'OK) (do ((i 1 (+ i 1)))((> i 4) 'OK) (forward turtle 50)(right turtle 90))(right turtle 20))(pencolor turtle 255 255 255)(do ((i 1 (+ i 1)))((> i 18) 'OK) (do ((i 1 (+ i 1)))((> i 4) 'OK) (forward turtle 50)(right turtle 90))(right turtle 20))(pencolor turtle 0 0 0)(pencolor turtle 0 0 255)(do ((i 1 (+ i 1)))((> i 18) 'OK) (do ((i 1 (+ i 1)))((> i 4) 'OK) (forward turtle 50)(right turtle 90))(right turtle 20)) </eval> Compiler ZRa2Turtle Demo verwendet einen ZRa2Tutle-Compiler. Dort kann man diesen Zielcode generieren lassen.