Scriptsprache

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    @nafets3646: Du bist auf dem richtigen Weg. Konvertiere deine Präfix-Notation erstmal in Postfix. Beispiel:

    Quellcode

    1. Infix: a+b
    2. Präfix: +ab
    3. Postfix: ab+

    Die Postfix-Notation wertest du mit einer Stackmaschine aus. Angenommen, du hast folgenden Ausdruck:

    Quellcode

    1. X <- Input("Gib mich Zahl:") + 1
    2. Postfix: "Gib mich Zahl" Input() 1 + X <-

    Der Tokenizer macht daraus (zum Beispiel)

    Quellcode

    1. VARIABLE(0) OPERATOR(0) FUNCTION(0) CONSTANT(0) OPERATOR(1) CONSTANT(1)
    2. Postfix: CONSTANT(0) FUNCTION(0) CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0)

    ...mit folgenden Tabellen

    Quellcode

    1. VARIABLE
    2. 0 = X
    3. OPERATOR
    4. 0 = <-, 2 'Anzahl Argumente (oft einfach hartcodiert, weil das immer bekannt ist)
    5. 1 = +, 2
    6. FUNCTION
    7. 0 = Input, 1
    8. CONSTANT
    9. 0 = "Gib mich Zahl"
    10. 1 = 1

    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

    1. [Stack] | [Restausdruck] | [Aktion]
    2. leer | CONSTANT(0) FUNCTION(0) CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0)
    3. "Gib mich Zahl:" | FUNCTION(0) CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0)
    4. leer | CONSTANT(1) OPERATOR(1) VARIABLE(0) OPERATOR(0) | Auswerten, Ausgabe, Warte auf Eingabe, Ergebnis (angenommen: 5) auf den Stack legen
    5. 1 5 | OPERATOR(1) VARIABLE(0) OPERATOR(0)
    6. leer | VARIABLE(0) OPERATOR(0) | Auswerten, 5 + 1, Ergebnis auf den Stack
    7. X 6 | OPERATOR(0)
    8. 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