Eine eigene Scriptsprache
-
Hallo, wenn ihr das liest denkt bitte nicht noch einer der mehr machen will als er kann.
Ich bin in der Tat ein Wochenendprogrammierer. Ich habe mich mal vor langer Zeit hingesetzt um eine eigene Scriptsprache zu programmieren.
Was ich bis jetzt habe?
Ich kann Parsen.
Also nehmen wir einen String:
Funktion 10.4,4.8
Mein Programm kann jetzt die 10.4 und die 4.0 aus dem String parsen. Oder
Load "Bitmap.bmp"
Hier kann ich das Bitma.bmp parsen.
Jetzt will ich sagen wir mal eine Varibale machen und evt. mit einerm Wert oder Varibalen addieren. Für den Anfang
a = 10
b = a+1
Print bSo wie funktioniert das
Ich könnte ein struct machen das die Variable representiert.
struct VARIABLE
{
int value;
int id;
...
}Ich müsste das ja in einer Liste verwalten???
a = 10
müsste ein neuen Eintrag in der Liste machen und in diesen den Wert 10 Speichern.
Wenn ich jetzt den Inhalt von a ausgeben will müsste ich aber die ganze Liste durchlaufen und den Eintrag mit der ID 'a' finden und den Wert auslesen.
Könnt ihr mir da ein paar Tips geben.
danke.
-
Hast ja schon fast alles, in einfachen Scriptsprachen ists mit Sichtbarkeit, Typen, etc. sowieso nicht weit.
Nehmen wir an du magst die Typen VALUE und STRING machen:
struct Variable { enum type; std::string name; VariablenTyp* value; };
VariablenTyp ist eine abstrakte Basisklasse für alle Typen, je nachdem was in type steht castest du auf den richtigen Typ. Der Pointer ist nötig damit das auch funktioniert.
Je nach Parsing (zB du findest "") setzt du type und weist value ein Objekt zu (im Falle von "" zB ein VariablenTypString).
Wenn die Variable referenziert wird einfach die Liste durchlaufen und auf iterator->name==name prüfen. Je nach Typ können auch nur bestimmte Operationen durchgeführt werden.
Fertig
MfG SideWinder
-
Danke für die Antwort. Genau so muss ich es realisieren. Hört sich gut an.
In der List muss ich auch Operatoren verwalten.
Nehmen wir mal an in der Liste steht so was:
Script
c = a + b
Name: c Value: NULL Name: = Value: NULL Name: a Value: 10 Name: + Value: NULL Name: b Value: 20
Wie würde der Parser damit umgehen ?
Das = würde dazu führen das c zwischengespeichert wird. Das + würde dafür sorgen das a mit b addiert wird. Und in c gespeichert wird.
Also müsste ich einen "Register" definieren in das man Ergebnisse von Berechnungen ablegen kann.
Oh man. Jetzt verstehe ich was eine VM ist.
Ich müsste praktisch einen Prozessor simulieren.