DIC - Skriptsprache für PureBasic

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

DIC - Skriptsprache für PureBasic

Beitrag 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.
Zuletzt geändert von STARGÅTE am 27.08.2010 00:56, insgesamt 3-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Ist das nicht eher ein Interpreter?
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Re: DIC - Dynamischer Interner Compiler

Beitrag 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 ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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 ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ^^
Zuletzt geändert von STARGÅTE am 27.08.2010 00:55, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten