BuK/IIm10/BuK-Übung08 G1
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
= RAM-Berechenbarkeit =
== Aufgabenstellung ==
Zeigen Sie, dass die Multiplikationsfunktion für natürliche Zahlen RAM-berechenbar ist.
<language>Scheme</language>
== Lösung ==
Die einzelnen Zahlen der Gleichung <math>a*b=c</math> werden wie folgt auf die Variablen verteilt.
<math>
\begin{array}{ccc}
a & \mapsto & R1\\
b & \mapsto & R2 \\
c & \mapsto & R0
\end{array}
</math>
Somit kann für das Beispiel <math>a=2</math> und <math>b=3</math> dann folgendes Programm angegeben werden.
<code id="4de36587d26b6">
0 R1 = 2
1 R2 = 3
2 R3 = 1
3 IFZERO R2 GOTO
4 R0 += R1
5 R2 -= R3
6 GOTO 3
7 STOP
</code>
= RAM-Interpreter=
== Aufgabenstellung ==
Verwenden Sie VCC aus AtoCC, um einen Interpreter für RAM-Programme zu entwickeln.
== Lösung ==
Der entsprechende Interpreter ist im [http://michael-hielscher.de/compilerwiki/index.php/Compiler_38150_1_Demo CompilerWiki] zu finden.
= LOOP-Berechenbarkeit =
== Aufgabenstellung ==
Zeigen Sie, dass die Multiplikationsfunktion für natürliche Zahlen LOOP-berechenbar ist.
== Lösung ==
Die einzelnen Zahlen der Gleichung <math>a*b=c</math> werden wie folgt auf die Variablen verteilt.
<math>
\begin{array}{ccc}
a & \mapsto & x1\\
b & \mapsto & Konstante \\
c & \mapsto & x0
\end{array}
</math>
Somit kann für das Beispiel <math>a=2</math> und <math>b=3</math> dann folgendes Programm angegeben werden.
<code>
x1 = 2;
LOOP x1 DO
x0 := x0 + 3;
END
</code>
= LOOP- und WHILE-Interpreter =
== Aufgabenstellung ==
Verwenden Sie VCC aus AtoCC, um einen Interpreter für LOOP-Programme zu entwickeln. Erweitern Sie im nächsten Schritt die LOOP-Sprache durch das WHILE-Sprachelement, um einen Interpreter für WHILE-Programme zu erhalten.
== Lösung ==
=== LOOP-Interpreter ===
Ein LOOP-Interpreter besitzt die folgenden Syntaxregeln:
* Variablen: x0, x1, x2,....
* Konstanten: 0, 1, 2, ...
* Trennsymbole: := , ;
* Operstionszeichen: +, -
* Schlüsselwörter: Loop, Do, End
* Wertzuweisungen:
: <math>x_i := x_j + c</math>
: <math>x_i := x_j - c</math>
Dafür wurde die folgende Grammatik definiert:
G = (N, T, P, s)
N = {S, P, Körper, Operation, Wertzuweisung, Schleife}
T = {End, Variable, :=, +, Konstante, ;, -, Loop, Do}
P = {
S -> P End
P -> Körper | Körper P
Körper -> Operation
| Wertzuweisung
| Schleife Operation
| Schleife Wertzuweisung
Operation -> Variable := Variable + Konstante ;
| Variable := Variable - Konstante ;
Wertzuweisung -> Variable := Konstante ;
| Variable := Variable ;
Schleife -> Variable := Konstante ; Loop Variable Do
}
s = S
=== While-Interpreter ===
Unser While-Interpreter besitzt die folgenden Syntaxregeln:
* Variablen: x0, x1, x2,....
* Konstanten: 0, 1, 2, ...
* Trennsymbole: := , ;
* Operstionszeichen: +, -
* Schlüsselwörter: While, !=0, Do, End
* Wertzuweisungen:
: <math>x_i := x_j + c</math>
: <math>x_i := x_j - c</math>
Dafür wurde die folgende Grammatik definiert:
G = (N, T, P, s)
N = {S, P, Körper, Operation, Wertzuweisung, Schleife}
T = {End, Variable, :=, +, Konstante, ;, -, While, !=0, Do}
P = {
S -> P End
P -> Körper | Körper P
Körper -> Operation
| Wertzuweisung
| Schleife Operation
| Schleife Wertzuweisung
Operation -> Variable := Variable + Konstante ;
| Variable := Variable - Konstante ;
Wertzuweisung -> Variable := Konstante ;
| Variable := Variable ;
Schleife -> Variable := Konstante ; While Variable !=0 Do
}
s = S
= GOTO-Interpreter =
== Aufgabenstellung ==
Verwenden Sie VCC aus AtoCC, um einen Interpreter für GOTO-Programme zu entwickeln.
== Lösung ==
Der entsprechende Interpreter ist auch hier im [http://michael-hielscher.de/compilerwiki/index.php/Compiler_38150_2_Demo CompilerWiki] zu finden.