Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   LeanoParser: Ein recursive Descent Parser (eig.Interpreter). (https://www.delphipraxis.net/85911-leanoparser-ein-recursive-descent-parser-eig-interpreter.html)

yankee 6. Feb 2007 20:22


LeanoParser: Ein recursive Descent Parser (eig.Interpreter).
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @ll,

ich habe mir vor längerem mal vorgenommen einen Matheparser zu schreiben, dann eienn Scriptparser und demletzt habe ich damit mal angefangen.
Eigentlich wollte ich den in ein Projekt mit einem Freund einbringen, den ich aber schon seit Weihnachten nichtmehr erreichen kann.
Eigentlich sollte der Code in das Projekt "Leano" von usn einfliessen. Daher auch der Name "LeanoParser.".

Viel kann der Parser noch nicht, aber immerhin:
- 3 Variabletypen: Float (=Extended), String und Array.
- Ich habe mir Mühe gegeben mich an die php-Syntax zu halten. Ziel ist es, dass jeder LeanoParser-Code auch gültiger php-Code ist... (Umgekehrt natürlich nicht, soweit wollte ich nicht gehen ;-)).
- Basis Mathe-operationen (*,/,+,-,Potenz)
- Definieren eigener Funktionen vor dem Interpretieren (in Delphi).
- Eine absolut pre-Alpha-mässigen Funktionssupport.

Wichtes Ziel ist es auch noch, dass man den Parser leicht in Delphi einbauen kann. Dafür reicht:
Delphi-Quellcode:
uses UParser;

procedure parse;
var tmp: PChar;
    stdout: TStream; //da gehen die Ausgaben hin
begin
  tmp :='print(5*3);';
  parser :=TYParser.Create(stdout);
  parser.parse(tmp);
  parser.Free;
end;
In dem zip-Paket im Anhang findet ihr den Quelltext mit einem kleiner Demo-programm, das auch bereits etwas Demo-quelltext enthält.
Wenn ihr euch selber Funktionen definieren wollt, geht das so:
Delphi-Quellcode:
function MeineFunktion(parser: TYParser; args: TLeanoVarDynArray):TLeanoVar;
begin
  if length(args) <> 1 then raise EWrongArgumentCountException.Create('Wrong Parameter Count',length(args),1); //Wenn die Funktion genau einen Parameter haben soll, sieht so die Prüfung aus
  showmessage(args[0].AsString);
  result :=TLeanoBool.Create(true);
end;

procedure parse;
begin
  ...
  parser.registerFunction('MeineFunktion',@MeineFunktion);
  ...
end;
In Delphi ist jede Variable also ein Objekt (TLeanoBool, TLeanoString und TLeanoArray), die alle von TLeanoVar abgeleited sind.
TLeanoVar.AsString, .AsFloat und .AsBool "casten" die Variable, die sich in der ableitung verbirgt nach php-Vorbild in was immer ihr braucht (Boolean, Extended, string).

Ich hoffe das war verständlich, wenn nicht, dann scheut nicht nachzufragen.

Warum stelle ich das ganze in die DP, wenn ich noch eine recht lange todo-Liste habe und nach eigener Angabe noch im pre-Alpgha-Status stecke?
- Der Teil der funktioniert funktioniert ja schon. Vielleicht kann damit ja jemand was anfangen :-).
- Das ist der erste Interpreter, den ich schreibe und ich hoffe von ein paar Erfahrenen Proggern, die vielleicht aml eienn Blick auf meinen qt werfen mir vielleicht ein paar Tipps geben könbnen :-). Also haut rein ;-).

EDIT: Die Demo enthält noch eine Klasse, die von einem Stream abgeleited ist und die Ausgaben immer in TStrings schreibt um in einer Memo ausgegeben zu werden...
Nicht gerade die Feine Art (besonders, wenn amns ich den qt mal ansieht), aber mir ist nichts besseres eingefallen. Also auch wenn ihr da Tipps habt...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 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