@nafets3646: Du bist auf dem richtigen Weg. Konvertiere deine Präfix-Notation erstmal in Postfix. Beispiel:
Die Postfix-Notation wertest du mit einer Stackmaschine aus. Angenommen, du hast folgenden Ausdruck:
Der Tokenizer macht daraus (zum Beispiel)
...mit folgenden Tabellen
Die Stackmaschine liest den Postfix-Ausdruck und wertet die Tokens aus. Wenn das Token eine Variable oder Konstante ist, dann lege sie auf den Stack. Sonst führe den Operator oder die Funktion aus. Dazu nimm die passende Anzahl an Argumenten vom Stack und ab gehts. In unserem Beispiel:
Du musst die Tokens nicht typisieren und brauchst auch keine Tabellen - man kann das alles hartcodieren. Dann ist der Code aber schlecht erweiterbar. Meistens zerstörst du dann die "alte" Logik, wenn du was neues anfügen willst.
Ein Compiler erzeugt zur Syntaxprüfung einen Baum, wie EiPott angedeutet hat. Die Stackmaschine sagt dir bei der Ausführung aber auch, wenn was nicht stimmt. Dazu musst du (unter anderem) vor jeder ausgeführten Operation eine Typprüfung machen (String + 1 geht z.B. nicht). Außerdem ist es sinnvoll vorher nachzuschauen, ob genug Argumente auf dem Stack liegen.
Die Postfix-Notation wertest du mit einer Stackmaschine aus. Angenommen, du hast folgenden Ausdruck:
Der Tokenizer macht daraus (zum Beispiel)
...mit folgenden Tabellen
Die Stackmaschine liest den Postfix-Ausdruck und wertet die Tokens aus. Wenn das Token eine Variable oder Konstante ist, dann lege sie auf den Stack. Sonst führe den Operator oder die Funktion aus. Dazu nimm die passende Anzahl an Argumenten vom Stack und ab gehts. In unserem Beispiel:
Quellcode
- [Stack] | [Restausdruck] | [Aktion]
- leer | CONSTANT(0) FUNCTION(0) CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0)
- "Gib mich Zahl:" | FUNCTION(0) CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0)
- leer | CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0) | Auswerten, Ausgabe, Warte auf Eingabe, Ergebnis (angenommen: 5) auf den Stack legen
- 1 5 | OPERATOR(1) VARIABLE(0) OPERATOR(0)
- leer | VARIABLE(0) OPERATOR(0) | Auswerten, 5 + 1, Ergebnis auf den Stack
- X 6 | OPERATOR(0)
- leer | leer | X = 6
Du musst die Tokens nicht typisieren und brauchst auch keine Tabellen - man kann das alles hartcodieren. Dann ist der Code aber schlecht erweiterbar. Meistens zerstörst du dann die "alte" Logik, wenn du was neues anfügen willst.
Ein Compiler erzeugt zur Syntaxprüfung einen Baum, wie EiPott angedeutet hat. Die Stackmaschine sagt dir bei der Ausführung aber auch, wenn was nicht stimmt. Dazu musst du (unter anderem) vor jeder ausgeführten Operation eine Typprüfung machen (String + 1 geht z.B. nicht). Außerdem ist es sinnvoll vorher nachzuschauen, ob genug Argumente auf dem Stack liegen.
Gruß
hal2000
hal2000