Seite 1 von 2

DIC - Skriptsprache für PureBasic

Verfasst: 19.11.2007 21:30
von STARGÅTE
Tachchen,

ich habe zur Zeit ein kleines Nebenprojekt was ich euch hier mal zeigen möchte.
Es ist ein dynamicher interner Compiler (über den Namen kann noch geredet werden) der es ermöglicht einen PB-Code in einer Fertigen Anwendung auszuführen ohne sie zu Compilieren.
Hintergrund war/ist es, eine ScriptSprache für eine KI zu schreiben, die ähnlich dem PB-Syntax ist.

Zur Zeit sind Volgende Dinge schon möglich:
- Variableninhalte von Anwendung zu DIC austauschen
- Ändern/Benutzung von diesen Variablen
- komplexe Mathematische Terme werden berechnet.
- Einfache Aussagenlogik ist enthalten
- Schleifen/Abfragen

Was noch kommen soll:
- Verbesserung der Syntaxüberprüfung
- Arrays

Hier das IncludeFile`
(Ist 3.3, sind aber nur kleine änderungen für 4.x nötig)

Hier ein BeispielCode wie man es verwenden kann:

Code: Alles auswählen


IncludeFile "DIC.pb"

SetDICVar("MeineVariable", "1")
SetDICVar("DeineVariable", "2")

Code$ = ""
Code$ + "MeineVariable = DeineVariable + 3 :"
Code$ + "DeineVariable=MeineVariable-5 :"
Code$ + "IF DeineVariable = 0 :"
Code$ + " DeineVariable=#PI :"
Code$ + "ENDIF:"
Code$ + "IF DeineVariable = #PI :"
Code$ + " FOR j=1 TO 2 :"
Code$ + "  IF MeineVariable = 5 AND UUU = 0 :"
Code$ + "   GrößteZahl = 123:"
Code$ + "  ENDIF :"
Code$ + " NEXT :"
Code$ + "ENDIF:"
Code$ + "FOR n = 1 TO 3 :"
Code$ + " Reihe = Reihe + n :"
Code$ + " FOR i = 1 TO 2 :"
Code$ + "  u = n*i:"
Code$ + " NEXT :"
Code$ + "NEXT :"

StartDebuggerDIC()
RunDIC(Code$)
Debug LastErrorDIC()

Debug "----"

Debug "MeineVariable = "+GetDICVar("MeineVariable")
Debug "DeineVariable = "+GetDICVar("DeineVariable")
Debug "n = "+GetDICVar("n")
Debug "GrößteZahl = "+GetDICVar("GrößteZahl")
Debug "Reihe = "+GetDICVar("Reihe")
Damit könnte man nun zB. ein Spiel schreiben wo sich die die KI der Situation anpassen und ihre eigen eigene Code schreiben/anpassen der dann im Spiel ausgeführt wird.

Wie gesagt: Das ist erst der Anfang, ich werden immer weiter dran arbeiten und dinge hinzufügen.

Verfasst: 19.11.2007 22:57
von Thorium
Ist das nicht eher ein Interpreter?

Re: DIC - Dynamischer Interner Compiler

Verfasst: 19.11.2007 23:35
von ZeHa
STARGÅTE hat geschrieben:Wie gesagt: Das ist erst der Anfang, ich werden immer weiter dran arbeiten und dinge hinzufügen.
Dann solltest Du Dir aber unbedingt ein paar Dinge über Parser und Grammatiken durchlesen. Die Grundidee ist gut, eine Skriptsprache für PureBasic. Aber es könnte irgendwann verdammt schwierig werden, neue Dinge hinzuzufügen, da Dein Code scheinbar recht "naiv" zu parsen scheint. Das mit den {} könnte schon ein erstes Zeichen sein, also nimm Dir das zu Herzen und informiere Dich rechtzeitig, bevor das Projekt so durchwachsen ist, daß Du an einer Stelle ein Feature hinzufügst und dann an fünf anderen Stellen bugfixen mußt ;)

Verfasst: 19.11.2007 23:50
von STARGÅTE
Jup das mit den { } will ich auch so schnell wie möglich wegbekommen, genauso wie die stake anfälligkeit des CODEs wenn man nicht die LEER-Zeichen einhält.

ich werde mal WIKI danach fragen (Parser und Grammatiken)

Verfasst: 19.11.2007 23:57
von ZeHa
Das mit den Leerzeichen dürfte eigentlich kein Problem sein, einfach mit Trim() arbeiten (falls es das unter 3.30 noch nicht gibt, mußt Du Dir das natürlich selbst implementieren).

Vielleicht ist das hier was für Dich, das ist ein sehr bekanntes System zum Generieren von Parsern:
http://dinosaur.compilertools.net/

Grundsätzlich ist es am besten, mit einer Baumstruktur zu arbeiten, sprich, Du unterteilst die komplette Zeile nach und nach in einen Baum. Dann kannst Du von der Wurzel aus gehen und alle Äste nach und nach auflösen. Leider gibt's unter PB keine Bäume, daher mußt Du Dir entweder selber einen zurechtprogrammieren oder mal schauen, ob das schonmal jemand gemacht hat, wäre jedenfalls äußerst praktisch.

Bin jedenfalls gespannt, wie es sich entwickelt, Skripting ist mir so oder so sehr sympathisch ;)

Verfasst: 20.11.2007 00:11
von STARGÅTE
Das mit den Leerzeichen dürfte eigentlich kein Problem sein, einfach mit Trim() arbeiten (falls es das unter 3.30 noch nicht gibt, mußt Du Dir das natürlich selbst implementieren).
das meinte ich nicht ^^ ich meinte das er wenn er IF suchen soll auch bei ENDIF zuschlägt. Deswegen lasse ich immer nach " IF " suchen

Das mit dem Baum und den Ästen mache ich ja, wie du vllt im CODE erkennen kannst.
Ich zerlege den Code stück für Stück in einzelne Aussagen und diese Terme wiederum werden in einzelne Zahlen zerlegt ... das funzt schon ganz gut

Verfasst: 20.11.2007 01:13
von TomS
Du musst halt das ENDIF vor dem IF suchen.
Dann ist dieser Teil des Codes ja schon umgesetzt und kann gelöscht werden.

So hab ich Teile von meinem BB-Code-Parser in php geschrieben.
Aber da gibt's ja auch reguläre Ausdrücke. Das könnte man IF und ENDIF gleich mit einem Streich parsen und das, was dazwischen steht wieder an den Parser zur weiteren Bearbeitung übergeben. Weiß nicht inwiefern so was überhaupt in PB umsetzbar ist

Verfasst: 20.11.2007 01:27
von STARGÅTE
ne das geht leider nicht, denn es wird später auch Schleifen geben, sodass der CODE erhalten bleiben muss.

JO in php ist es einfacher, obwohl ich da nicht mit Regulären Ausdrücken gearbeitet habe, da es dann manchem bei falschen Syntax im Post eines Benutzer zu Fehlübersetzungen kam, deswgeen hatte ich da eine Rekursive abfrage.

mal sehn ich ich das hinbekomme....

Verfasst: 20.11.2007 09:20
von ZeHa
Eigentlich mußt Du es doch nur anhand von Trennzeichen zerlegen und dann jedes Token einzeln betrachten. Auf diese Art und Weise wirst Du niemals ein IF und ein ENDIF verwechseln.
Das mit dem Baum und den Ästen mache ich ja, wie du vllt im CODE erkennen kannst.
Sorry, aber im Code kann ich überhaupt nix erkennen :mrgreen:
Wenn Du mir vielleicht einfach die Stelle nennen würdest... ich meinte jedenfalls einen richtigen Binärbaum, den man rekursiv auflösen kann, davon hab ich im Code nix gefunden

Verfasst: 20.11.2007 09:55
von STARGÅTE
Sorry, aber im Code kann ich überhaupt nix erkennen
Schade^^

Also das mit den Klammern habe ich jetzt in den Griff bekommen.

Naja nach einem = für Vergleich kann ich ja nicht suchen, da es sich ja auch um eine Zuweisung handel könnte.
H I E R mal die Debuggerausgabe meiner neuen Version, vllt erkennt man da wie er arbeitet ^^

Ich muss also schon nach einem IF suchen lassen um zu wissen um was für eine Art Befehl es geht : Abfrage, Schleife, Zuweisung, ...

PS: Die neue Version stelle ich heute Nacht rein, bin jetzt weg ^^