IIm18-Kreativaufgabe8
Aus ProgrammingWiki
Inhaltsverzeichnis |
LOOP - WHILE - GOTO
Entwickeln Sie einen Compiler, der als Eingabesprache LWHILE ∪ LGOTO ∪ LLOOP verwendet und ein zur Eingabe äquivalentes Programm aus LWHILE(Zielsprache) erzeugt. Die Interpretation des jeweils entstandenen WHILE-Programms ist nicht gefordert.
Compiler
Grammatik, Scanner und Parser wurden mit Hilfe von FLACI entwickelt.
Grammatik
Der Compiler kann hier selbst im FLACI ausprobiert werden.
Testprogramme
WHILE
x0 := x0+1; WHILE x0 != 0 DO x0 := x0 - 1 END
LOOP
x1 := x1 + 1; LOOP x0 DO x1 := x1 + 0 END; LOOP x1 DO x1 := x1 + 1 END
GOTO
M1: IF x1 == 0 THEN GOTO M2; M3: x0 := x0 + 0; M2: GOTO M1; M4: x0 := x0 + 1;
Im Compiler wurde die Übertragung von GOTO nach WHILE nur vereinfacht dargestellt, da allein schon das Transformieren einer bedingten Verzweigung recht unübersichtlich wird. Da unter Umständen noch IFs in einander verschachtelt sind oder auf Gleichheit einer Konstanten geprüft wird, die nicht 0 ist, wäre das Resultat der Transformation noch komplizierter. Deshalb wird im folgenden Kapitel erklärt, wie bei der Transformation eines solchen Spezialfalls vorzugehen ist.
Vergleich übertragen
- IF kann mit LOOP simuliert werden
- LOOP kann durch WHILE simuliert werden
- bei IF xi == 0 THEN P END ->
x1 := x1 + 1;
LOOP x0 DO x1 := x1 + 0 END;
LOOP x1 DO x1 := x1 + 1 END - bei IF xi == c THEN P END wesentlich umfangreicher
- Exemplarische Darstellung mit Hilfe der LOOP-Funktionen in PRALA
- Import der notwendigen Funktionen
Gr11wety_Prala-funktionen.zip (0.1 MB) - equals-Funktion kann wieder aufgeschlüsselt werden, sodass nur LOOP verwendet wird
- succ() kann ersetzt werden durch xi := xi + 1
- mit dem daraus entstandenen LOOP Programm kann überprüft werden, ob 2 Zahlen gleich sind
- dieses kann dann in ein WHILE Programm überführt werden
![]() | Gr11wety_Equals-loop-while.zip (0.1 MB) |
- unter Verwendung dieses WHILE Programms kann eine IF-Anweisung, wie IF xi==c THEN P END, als WHILE Programm simuliert werden