BuK/IIm10/BuK-Übung08 G2
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Java</language>
=RAM-Berechenbarkeit=
==Aufgabe==
Zeigen Sie, dass die Multiplikationsfunktion für natürliche Zahlen RAM-berechenbar ist.
==Lösung==
=RAM-Interpreter=
==Aufgabe==
Verwenden Sie VCC aus AtoCC, um einen Interpreter fur RAM-Programme zu entwi-
ckeln.
==Lösung==
=LOOP-Berechenbarkeit=
==Aufgabe==
Zeigen Sie, dass die Multiplikationsfunktion für natürliche Zahlen LOOP-berechenbar ist.
==Lösung==
Um die LOOP-berechenbarkeit für die Multiplikationsfunktion zu zeigen, muss ein LOOP-Programm angegeben werden, dass die Multiplikation ausführt. Ein solches Program befindet sich im nächsten Abschnitt.
=LOOP- und WHILE-Interpreter=
==Aufgabe==
Verwenden Sie VCC aus AtoCC, um einen Interpreter fur LOOP-Programme zu ent-
wickeln. Erweitern Sie im nachsten Schritt die LOOP-Sprache durch das WHILE-
Sprachelement, um einen Interpreter fur WHILE-Programme zu erhalten.
==Lösung==
LOOP-Programme können aus folgenden verschiedenen Anweisungen gebildet werden:
* Zählschleife
* Wertzuweisung
** mit Plus-Operation
** mit Minus-Operation
Weiterhin gelten folgende Regeln:
* Zwei, mit einem Semikolon verkettete LOOP-Programme, bilden wieder ein LOOP-Programm.
* Benötigte Variablen werden zu Beginn bereitgestellt.
* Das Endergebnis steht in der Variable x0
Daraus wurde mit kfGEdit die Grammatik erstellt:
S -> ZEILEN
ZEILEN -> ANWEISUNG mehrZEILEN
mehrZEILEN -> ; ZEILEN | EPSILON
ANWEISUNG -> VAR := VAR WZ | LOOPPrgm | WhilePrgm
WZ -> OP ZAHL | EPSILON
LOOPPrgm -> LOOP VAR DO ZEILEN END
WhilePrgm -> WHILE ISZERO VAR DO ZEILEN END
VAR -> x ZAHL
OP -> + | -
Die Addition zweier Zahlen in x0 und x1 verlangt diese Eingabe:
<run id="4de3985033c4a">
LOOP x1 DO x0 := x0 + 1 ; x0 := x0 + 1 END
</run>
Für die Multiplikation werden zwei Schleifen verschachtelt:
<run id="4de3985033cc6">
x2 := x0;
LOOP x1 DO LOOP x2 DO x0 := x0 + 1 END END;
LOOP x2 DO x0 := x0 - 1 END
</run>
Für die WHILE-berechenbarkeit ist bereits in der Grammatik das WHILE-Sprachelement mit hinzugefügt worden. Der Aufruf dieser Schleife sieht so aus:
<run id="4de3985033d46">
WHILE ISZERO x1 DO x0 := x0 + 1 END
</run>
=GOTO-Interpreter=
==Aufgabe==
Verwenden Sie VCC aus AtoCC, um einen Interpreter für GOTO-Programme zu entwickeln.
==Lösung==
Ein GOTO-Programm besteht aus Marken <math>M_i</math> denen jeweils eine Anweisung <math>A_i</math> getrennt durch einen Doppelpunkt (:). Marken, auf die kein GOTO-Befehl verweist, können weggelassen werden.
<blockquote><math>M_1 : A_1; M_2 : A_2; ...; M_k : A_k</math></blockquote>
Es stehen 5 verschiedene Anweisungen zur Auswahl:
* Wertzuweisung: <math>x_i := x_j + c</math>
* Wertzuweisung: <math>x_i := x_j - c</math> (<math>x_i := 0</math>, wenn <math>x_j - c < 0</math>)
* unbedingter Sprung: '''GOTO <math>M_i</math>'''
* bedingter Sprung: '''IF <math>x_i = c</math> THEN GOTO <math>M_i</math>'''
* Stop: '''HALT'''
Es gilt:
*<math>x_{i,j}</math> sind Variablen (<math>i,j \in \mathbb{N} \backslash \{0\}</math>)
*<math>c</math> ist eine Konstante (<math>c \in \mathbb{N}</math>)
*Eine Variable, der kein Wert explizit zugewiesen wurde, hat den Wert 0.
Ein GOTO-Programm zur Berechnung von 3 * 5. Das Ergebnis befindet sich in <math>x_1</math>
x2 := x2 + 3
M1 : IF x2 = 0 THEN GOTO M2
x1 := x1 + 5
x2 := x2 - 1
GOTO M1
M2 : HALT
Für die Entwicklung des Interpreters mit VCC haben wir zuerst mit kfG-Edit diese Grammatik erstellt.
G = (N, T, P, s)
N = {P, LINES, LINE, MARKER, INSTRUCTION, ASSIGNMENT, VARIABLE, OPERATOR, JUMP, IF_THEN}
T = {:, M, KONSTANTE, HALT, :=, X, +, -, GOTO, IF, =, THEN}
P = {
P -> LINES
LINES -> LINE | LINE LINES
LINE -> MARKER : INSTRUCTION
| INSTRUCTION
MARKER -> M KONSTANTE
INSTRUCTION -> HALT | IF_THEN | ASSIGNMENT | JUMP
ASSIGNMENT -> VARIABLE := VARIABLE OPERATOR KONSTANTE
VARIABLE -> X KONSTANTE
OPERATOR -> + | -
JUMP -> GOTO MARKER
IF_THEN -> IF VARIABLE = KONSTANTE THEN JUMP
}
s = P
Der daraufhin entwickelte Interpreter kann im [http://michael-hielscher.de/compilerwiki/index.php/Compiler_30816_Demo CompilerWiki] getestet werden.