Home > Informatik > Formale Sprachen > Folge 23: Variablenverwaltung

23.2 Ein Stack mit Variablen

23.1 - 23.2

Wenn wir arithmetische Ausdrücke wie

(3 + 4.5) * 7

von unserem Interpreter abarbeiten lassen wollen, so ist das kein Problem mehr. Wir öffnen einen Texteditor, schreiben die entsprechenden Stackcode-Befehle in eine Textdatei:

PUSH 3
PUSH 4.5
ADD 
PUSH 7
MUL

und starten unseren Interpreter. Dieser liest den Stackcode zunächst in seinen Codebuffer. Dann holt sich der Interpreter nach und nach die einzelnen Befehle sowie die Argumente und ruft dann die entsprechenden Befehle der Stackmaschine auf. Wenn der Stackinterpreter beispielsweise den PUSH-Befehl mit dem Argument 3 erkennt, pusht er die Zahl 3 auf den Stack.

Anweisungen mit Variablen

Wie sieht es nun aber mit komplexeren Anweisungen aus, bei denen Zwischenergebnisse in Variablen gespeichert werden. Hier ein Beispiel:

Radius = 25;
Pi = 3.14159;
Umfang = 2 * Pi * Radius;
Flaeche = Pi * Radius * Radius;

Wir wollen den Stackcode für diese vier Zeilen erzeugen und analysieren.

Radius = 25;

Der Stackcode für diese erste Zeile sieht so aus:

PUSH 25
ASSIGN Radius

Die Zahl 25 wird auf den noch leeren Stack gepusht. Der ASSIGN-Befehl bewirkt dann folgendes: In der Variablenverwaltung wird nachgeschaut, ob eine Variable mit dem Namen "Radius" existiert. Dies ist noch nicht der Fall, also wird eine solche Variable angelegt. Anschließend wird ihr der Wert zugewiesen, der oben im Stack steht, also die 25. Anschließend wird das oberste Stackelement gelöscht.

Pi = 3.14159;

Der Stackcode für die zweite Zeile ist analog aufgebaut:

PUSH 3.14159
ASSIGN Pi

Zunächst wird die Zahl auf den Stack gepusht. Sie ist die einzige Zahl in dem Stack, weil ja der vorherige ASSIGN Radius - Befehl den Stack geleert hat.

Der ASSIGN-Befehl legt dann eine neue Variable Pi in der Variablenliste an, weist ihr den Wert 3.14159 zu, der oben im Stacks steht, und entfernt dann die oberste (und einzige) Zahl aus dem Stack.

Umfang = 2 * Pi * Radius;

Nun kommt der Code für die erste Berechnung:

PUSH 2
VARPUSH Pi
MUL
VARPUSH Radius
MUL
ASSIGN Umfang

Die Zahl 2 wird auf den wieder leeren Stack gepusht. Der VARPUSH-Befehl veranlasst den Interpreter, in der Variablenliste nachzuschauen, ob eine Variable mit dem Namen "Pi" existiert. Ist dies der Fall, so wird der Zahlenwert dieser Variable ausgelesen und auf den Stack gepusht. Nach VARPUSH Pi besteht der Stack also aus den beiden Zahlen 2.0 (unten) und 3.14159 (oben).

Der MUL-Befehl bewirkt die Ausführung des Stackmaschinen-Befehls zum Multiplizieren der beiden obersten Stackelemente. Der Stack besteht anschließend nur aus einem Element mit dem Wert 6.28318.

Der VARPUSH Radius - Befehl schaut wieder in der Variablenliste nach, ob es eine Variable mit dem Namen "Radius" gibt. Da das der Fall ist, wird der Wert dieser Variable auf den Stack gepusht. Jetzt hat der Stack wieder zwei Elemente: 6.28318 (unten) und 25 (oben).

Der MUL-Befehl bildet das Produkt der beiden Stackelemente, und das Ergebnis 157.0795 dieser Multiplikation befindet sich oben im Stack.

ASSIGN Umfang schließlich speichert diesen Wert in einer Variablen namens "Umfang". Da diese in der Variablenliste noch nicht vorhanden ist, wird eine neue Variable mit diesem Namen erzeugt und dann mit dem Wert belegt, der oben im Stack steht. Anschließend wird das oberste Stackelement gelöscht, und der Stack ist wieder leer.

Damit haben Sie jetzt eine Vorstellung davon, wie eine Stackmaschine bzw. ein Stackinterpreter mit Variablen umgehen kann.

Übung 23.2-1

Erweitern Sie die Klasse Interpreter aus der letzten Folge um eine funktionierende Variablenverwaltung und testen Sie den Stackcode von dieser Seite oder einen eigenen, anderen Stackcode, der mindestens zwei Variablen enthält.

 
Übung 23.2-2

Ergänzen Sie die Klasse Varlist um eine show-Methode, die alle Variablen übersichtlich ausgibt (Name und Wert).

Jetzt geht es weiter mit dem nächsten großen Kapitel:
25 Reguläre Sprachen...