Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Parser - billige Lösung (https://www.delphipraxis.net/167514-parser-billige-loesung.html)

bernhard_LA 3. Apr 2012 10:52

Parser - billige Lösung
 
wir haben eine umfangreiche Anwendung , die der Benutzer entweder über die GUI oder über einfache *.txt Script Dateien verwenden kann.

Für die script Formatierung verwenden wir momentan *.ini file mit folgendem Layout

Delphi-Quellcode:

[Befehl]
Class=Leseverzeichniss
Parameter1=.bmp
Parameter2=Change_To_JPG
nicht sehr schön - fumktioniert aber. Wir haben halt mit einem Befehl auf Nutzer-Wünsche reagiert und angefangen, mittlerweile haben wir ca. 20 Befehle eingebaut.
Der neuerste Benutzer Request : ich möchte Befehle in Schleifen abarbeiten können, nur wenn Befehl i erfolgreich ist dann führ auch Befehl i+1 aus .....
Dh. der Simple Ansatz von einst kommt an seine Grenzen, der Wunsch entwickelt sich zu einer kleinen script - Sprache für unsere Anwendung :evil:

Meine aktuelle Idee besteht darin jetzt jeden Befehl als DLL Bereitzustellen und via DOS Batch dann die jewiligen DLL mit den nötigen Daten zu versorgen.
Gibt es eine bessere Idee für unser Problem ?
Will halt einen kompletten Parser programmieren:-(

Blup 3. Apr 2012 11:44

AW: Parser - billige Lösung
 
Lua

Popov 3. Apr 2012 12:24

AW: Parser - billige Lösung
 
@bernhard_LA

Das ist nicht so kompliziert wie es sich anhört. Ich habe inzwischen mehrere kleine Scriptsprachen geschrieben, und zufällig arbeite ich momentan wieder an einer.

Zuerst muß man sich bewußt werden was man alles damit machen will. Was ist nötig, was unnötig. Meine erste Scriptsprache die ich für eine Anwendung schrieb konnte ich sogar als einen kleinen Basicinterpreter verwenden. Was ich jetzt mache ist dagegen sehr simpel, da es sich an Anwender richtet die auch ohne Programmierkenntnisse programmieren können sollen. Aber egal für was du dich entscheidest, es ist einfacher als man denkt.

Hier ein sehr einfaches Konzept: Variablen beginnen mit einem $, Bezeichner für Funktionen und Variablen dürfen nur aus A-Z, a-z, _ und 0-9 Zeichen bestehen (und Kommentare nicht vergessen). Am Anfang ignorierst du die Leerzeichen und liest das erste Wort bis zu einem Sonderzeichen oder Ende. Sehr einfach, schon hast du den Befehl oder Variable. Als nächstes eine Funktion schreiben die ein Parameter ausliest. Das ist etwas komplexer, denn du mußt erkennen ob es eine Variable ist oder ein Wert, und wenn Wert, String oder Zahl. Das wäre einfach, denn man könnte bis zu einem Komma lesen, aber ein String kann auch ein Komma enthalten. Also eine Funktion schreiben die einen String in Anführungzeichen liest. Aber all das kann man sich sparen wenn du bereit bist paar Abstriche hinzunehmen. TStrings DelimiterText. Mach Komma zum Delimiter und schon hast du mit einer Zeile die Parameter als Liste. Wie gesagt, das funktioniert, man muß dann aber die Eigenarten von DelimiterText akzeptieren. Ich hab da was eigenes geschrieben, aber gehen, geht es. Nur wie gesagt, mit Vorsicht.

Also, ganz einfach: zuerst das erste Wort auslesen das den regeln entspricht, dann die Parameter über DelimiterText zerlegen. Für etwas simpeles reicht es. Und Schleifen sind auch kein so großes Problem.

v2afrank 3. Apr 2012 12:26

AW: Parser - billige Lösung
 
Oder Pascal Script Habe ich auch schon in einer Anwendung erfolgreich eingesetzt

WM_CLOSE 3. Apr 2012 12:41

AW: Parser - billige Lösung
 
Ich würde in Anbetracht dessen, dass es auch nicht Programmierer benutzen sollen eher auf µBASIC o.ä. setzen.
Funktionen sind da eher unverständlich und eine mögliche Fehlerquelle.

Iwo Asnet 3. Apr 2012 13:42

AW: Parser - billige Lösung
 
Bei MSSQL (Task management) kann man solche Sequenzen sehr leicht und intuitiv erstellen.
Man hat keine Schleifen, aber bedingte Ausführung von Schritten

Stell Dir vor, eine Tabelle mit 3 Spalten (Nummer, Befehl, Aktion nach Beenden)
Entscheidend ist "Aktion nach Beenden" dort gibt es zur Auswahl
"Bei Erfolg: Beenden"
"Bei Erfolg: Weiter bei Schritt xy"
"Bei Fehler: Beenden"
"Bei Fehler: Weiter bei Schritt xy"

Damit kann man einfache Verzweigungen und sogar Schleifen "programmieren"

Sollte sich auch als INI-Datei ablegen lassen.
Code:
[Schritt1]
Befehl=Essen
Parameter_1=Nudeln
Parameter_2=Gulasch
Naechster_Schritt_Bei_Erfolg=Schritt_Nachtisch
Naechster_Schritt_Bei_Fehler=Schritt_Herr_Ober

[Schritt_Nachtisch]
Befehl=Essen
Parameter_1=Torte
Parameter_2=Sahne
Naechster_Schritt_Bei_Erfolg=Schritt_Zahlen
Naechster_Schritt_Bei_Fehler=Schritt_Herr_Ober

[Schritt_Herr_Ober]
Befehl=Meckern
Parameter_1=Was für ein Saftladen!
Parameter_2=Ich werde nicht zahlen.
Naechster_Schritt_Bei_Erfolg=ENDE
Naechster_Schritt_Bei_Fehler=Schritt_Zahlen

[Schritt_Zahlen]
Befehl=Bezahlen
Naechster_Schritt_Bei_Erfolg=ENDE
Naechster_Schritt_Bei_Fehler=Schritt_Herr_Ober

Popov 3. Apr 2012 16:40

AW: Parser - billige Lösung
 
Liste der Anhänge anzeigen (Anzahl: 2)
@bernhard_LA

Ich habe mich gerade erinnert, dass ich vor etwa 10 Jahren eine Art Engine für eine Scriptsprache programmiert und sie sogar als OpenSource veröffentlicht habe. Also habe ich im Archiv gesucht, es gefunden, zusammengepackt und in den Anhang gestellt. Vielleicht kannst du damit etwas anfangen.

Noch zwei Punkte vorab: es ist nur ein Gerüst mit dem man eine Scriptsprache wie Lego basteln kann. Ich hab als Beispiel bereits Goto, Gosub, MessageBox und sogar eine If Abfrage eingebaut, aber trotzdem ist es nur ein Beispiel. Zweitens - das Ganze war damals mehr Grundlagenforschung, da sich damals in der Ferne ein Projekt anbahnte für das ich später eine Scriptsprache benötigen sollte. Heute würde ich einiges anders machen. Was ich damit sagen will ist - das ganze kann man besser machen. War eben der erste Versuch.

Ist ein 10 Jahre altes Projekt, guck ob du damit was anfangen kannst, für Antworten müßte ich es auch erst studieren.

Die eine Datei ist der Code, das zweite ein Beispiel.

bernhard_LA 4. Apr 2012 09:32

AW: Parser - billige Lösung
 
@popov : von der Komplexität hätte ich einen selber gebauten Script Interpreter auch in der Version Deiner Zip Beispiele erwartet, danke für die Vorlage.


lässt sich das Thema Script Interpreter nicht sehr einfach über TRegExpressions lösen ? Wird dann ein Scripter Interpreter in wenigen Zeilen Quellcode möglich ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz