BuK-Übung08 G2

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

RAM-Berechenbarkeit

Aufgabe

Zeigen Sie, dass die Multiplikationsfunktion für natürliche Zahlen RAM-berechenbar ist.

Lösung

Das folgende Programm berechnet die Multiplikation von 5 und 3. Das Ergebnis steht dann in R0. Alle Zeilen sind durchnummeriert und begonnen wird mit Zeile 1.

R0 = 5
R1 = 3
R3 = 1
R2 = R1
IFZERO R2 GOTO 9
R4 += R0
R2 -= R3
GOTO 5
R0 = R4
STOP

Werden zu Beginn die Register R0 und R1 mit anderen natürlichen Zahlen belegt, so wird die Multiplikation dieser Zahlen durchgeführt. Die Multiplikationsfunktion ist damit RAM-berechenbar.

RAM-Interpreter

Aufgabe

Verwenden Sie VCC aus AtoCC, um einen Interpreter für RAM-Programme zu entwickeln.

Lösung

Als Erstes wird eine Grammatik mit Hilfe von kfG Edit entworfen. Die einzelnen Anweisungen werden mit den Regeln instr abgebildet.

P      -> K 
K      -> inst K | EPSILON 
inst   -> R Zahl = R Zahl 
inst -> R Zahl = RR Zahl 
inst -> RR Zahl = R Zahl 
inst -> R Zahl = Zahl
inst -> R Zahl -= R Zahl 
inst -> R Zahl += R Zahl 
inst -> GOTO Zahl
inst -> IFZERO R Zahl GOTO Zahl
inst -> STOP
Zahl -> Digit Zahl | Digit
Digit  -> 0|1|...|9

Anschließend wird die Grammatik in VCC exportiert. Hier werden die S-Ausdrücke der einzelnen Regeln hinzugefügt. Der Interpreter kann unter [1] getestet werden.

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 -> + | -

Der Interpreter, welcher mit VCC aus AtoCC entwickelt wurde, kann im CompilerWiki mit verschiedenen Aufrufen getestet werden. Auch die WHILE-Aufrufe sind dort mit enthalten.

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 , denen jeweils eine Anweisung getrennt durch einen Doppelpunkt folgt. Marken, auf die kein GOTO-Befehl verweist, können weggelassen werden.

Es stehen 5 verschiedene Anweisungen zur Auswahl:

  • Wertzuweisung:
  • Wertzuweisung: (, wenn )
  • unbedingter Sprung: GOTO
  • bedingter Sprung: IF THEN GOTO
  • Stop: HALT

Es gilt:

  • sind Variablen ()
  • ist eine Konstante ()
  • 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

     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 CompilerWiki getestet werden.

Persönliche Werkzeuge