Compiler ZRa in Scheme+Turtle

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
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 = Programm

Zur 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 = Programm

Wir 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>
<canvas></canvas>