AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte LeanoParser: Ein recursive Descent Parser (eig.Interpreter).
Thema durchsuchen
Ansicht
Themen-Optionen

LeanoParser: Ein recursive Descent Parser (eig.Interpreter).

Ein Thema von yankee · begonnen am 6. Feb 2007
Antwort Antwort
Benutzerbild von yankee
yankee
Registriert seit: 10. Mär 2004
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...)
Angehängte Dateien
Dateityp: zip leanoparser_136.zip (15,2 KB, 36x aufgerufen)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
 
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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