BuK/IIm11/BuK-KA-WHILE-COMPILER
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
== Aufgabenstellung ==
Entwickeln Sie einen Compiler, der als Eingabesprache $L_{WHILE}\cup L_{GOTO}\cup L_{LOOP}$ verwendet und ein zur Eingabe äquivalentes Programm aus $L_{WHILE}$ (Zielsprache) erzeugt. Die Interpretation des jeweils entstandenen $WHILE$-Programms ist nicht gefordert.
Verwenden Sie AtoCC
== Grammatik ==
G = (N, T, P, s)
N={S, P_GOTO, Anweisung, P_LOOP, P_WHILE, Wertezuweisung, Variable, Marke, Konstante, Digit, Operation}
T={;, HALT, :, IF, ==, THEN, GOTO, LOOP, DO, END, WHILE, !=, 0, :=, x, M, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -}
P={
S -> P_GOTO ; HALT | P_LOOP | P_WHILE
P_GOTO -> Marke : Anweisung | Anweisung | P_GOTO ; P_GOTO
Anweisung -> Wertezuweisung | GOTO Marke
| IF Variable == Konstante THEN GOTO Marke
P_LOOP -> Wertezuweisung | P_LOOP ; P_LOOP | LOOP Variable DO P_LOOP END
P_WHILE -> Wertezuweisung | P_WHILE ; P_WHILE
| WHILE Variable != 0 DO P_WHILE END
Wertezuweisung -> Variable ':=' Variable Operation Konstante
Variable -> x Konstante
Marke -> M Konstante
Konstante -> Digit Konstante | Digit
Digit -> 0|1|...|9
Operation -> + | -
}
== Beispielprogramme ==
LOOP-Programm:
$x_1 := x_1 + 1$;
LOOP $x_0$ DO $x_1 := x_1 + 1$ END
Zugehöriger Ableitungsbaum für das Eingabewort '''x1 := x1 + 1; LOOP x0 DO x1 := x1 + 1 END''':
[[Bild:Sirokrau_Loop_wort_ableitungsbaum.png]]
WHILE-Programm:
$x_1 := x_1 +1$;
WHILE $x_1$ != 0 DO $x_1 := x_1 + 1$ END
Zugehöriger Ableitungsbaum für das Eingabewort ''' x1 := x1 +1;WHILE x1 != 0 DO x1 := x1 + 1 END''':
[[Bild:Sirokrau_While_wort_ableitungsbaum.png]]
GOTO-Programm:
M1: IF $x_1 = 1$ THEN GOTO M2;
GOTO M2;
HALT
Zugehöriger Ableitungsbaum für das Eingabewort ''' M1: IF x1 == 1 THEN GOTO M2;GOTO M2;HALT''':
[[Bild:Sirokrau_Goto_wort_ableitungsbaum.png]]
== Scanner ==
Definition:
[[Bild:Sirokrau_Scanner_def.png]]
Simulation:
[[Bild:Sirokrau_Loop_scanner_simulation.png]]
== Parser ==
[[Bild:Manuel_Parser.png]]
== Compiler ==
http://www.michael-hielscher.de/compilerwiki/index.php/ComilerBuK_WHILE