IIm18-Kreativaufgabe8
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
=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 [http://flaci.de/ FLACI] entwickelt. === Grammatik === [[Bild:Gr11wety_Loop-while-goto-grammatik.png|300px|Grammatik Ableitungsregeln]] [[Bild:Gr11wety_LOOP-WHILE-GOTO_Syntax.png|300px|Grammatik Syntax]] Der Compiler kann [https://flaci.com/T5ni12oga 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 -> <br/>x1 := x1 + 1;<br/>LOOP x0 DO x1 := x1 + 0 END;<br/>LOOP x1 DO x1 := x1 + 1 END * bei IF xi == c THEN P END wesentlich umfangreicher * Exemplarische Darstellung mit Hilfe der LOOP-Funktionen in [https://web1.hszg.de/cwagenknecht-lehre/prala/ PRALA] * Import der notwendigen Funktionen <document>Gr11wety_Prala-funktionen.zip</document> * ''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 <document>Gr11wety_Equals-loop-while.zip</document> * unter Verwendung dieses WHILE Programms kann eine IF-Anweisung, wie IF xi==c THEN P END, als WHILE Programm simuliert werden