Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Parser/Compiler für mathematische Ausdrücke (inkl.Var.&Fkt.) (https://www.delphipraxis.net/42444-parser-compiler-fuer-mathematische-ausdruecke-inkl-var-fkt.html)

tyberis 18. Mär 2005 22:49


Parser/Compiler für mathematische Ausdrücke (inkl.Var.&F
 
Hallo zusammen!
Hier ist mein Beitrag zur Community: Eine Unit mit einem Parser/Compiler für mathematische Ausdrücke. Es gibt zwar bereits viele Parser im Netz, jedoch ist die Auswertung der Ausdrücke meist sehr langsam, und deswegen nicht immer geeignet.

Beschreibung:
Die Funktion ParseExpr übersetzt einen Stringausdruck (z.B. "x^2+2x-sin(x)") in einen Bytecode. Dieser kann von der Funktion EvalExpr ausgewertet werden und/oder von der Funktion CompileExpr weiter zu Maschinencode compiliert werden. CompileExpr liefert (wahlweise) eine Funktion von folgenden Typen zurück:
Delphi-Quellcode:
 ExprFunc1V = function(const x : Extended) : Extended; // 1 Variable
 ExprFunc2V = function(const x,y : Extended) : Extended; // 2 Variablen
 ExprFuncR = function(var Args : array of Extended) : Extended; // beliebig viele Variablen
Die erzeugten Funktionen können dann wie übliche Delphifunktionen ausgeführt werden. Der erzeugte Code ist sehr schnell, i.A. sogar schneller als die äquivalente Funktion vom Delphicompiler. Der Stringausdruck kann beliebig viele Variablen enthalten.

Anwendungsbeispiel:
Delphi-Quellcode:
Var
  SinC : ExprFunc1V; // Function(const x : Extended) : Extended;
  Result : Extended;
begin
  SinC := CompileExpr(ParseExpr('sin(x)/x',['x']),tyPass1V);   // Parsen und compilieren
  Result := SinC(1.0);                                         // Auswerten
  FreeFunc(@SinC);                                             // Freigeben
end;
In der Unit enthalten ist zudem ein Interface-Wrapper. Die (indirekte) Benützung via Interface-Wrapper ist sicherer, da dieser zusätzliche Argument-Checks durchführt. Funktionen, die mit dem Interface-Wrapper erstellt sind, werden zudem auch automatisch vernichtet (das explizite Freigeben via FreeFunc wird somit überflüssig). Jedoch gibt das natürlich einen gewissen Overhead.

Anwendungsbeispiel mit Interface-Wrapper:
Delphi-Quellcode:
Var
  SinC : IExpr1V;
  Result : Extended;
begin
  SinC := compileStr1V('sin(x)/x');
  Result := sinc.Eval(1.0);
end;
Weitere Beispiele mit mehreren Variablen sind in der Source enthalten.

Download:
Unit tyParser.pas

Demo Programme Download:
Farbmix Parser-Demo: FarbMix.exe
TyMathPlotter: TyMathPlotter.exe

Kommentare/Anregungen/Kritik zum Parser oder zu den Demoprogrammen erwünscht :)

Gruss,
Simon

Robert_G 18. Mär 2005 22:59

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
:shock: Das ist echt gut. :thuimb:
Vor allem die Farbmixdemo zeigt wie schnell das Ding arbeitet.

Airblader 19. Mär 2005 08:26

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Hammer :shock:

Wie gesagt, die Farbmixdemo geht richtig ab

Die Muhkuh 19. Mär 2005 08:35

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Hi,

das Ding ist ja echt genial :shock: .

Ich werde mir nachher mal die Unit ansehen, aber ich bezweile, dass ich überhaupt etwas davon verstehe.

glkgereon 19. Mär 2005 08:37

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
wirklich gut!!!

und zum beispiel die graphen f(x)=pi^(sin(cos(x)^3)) und f(x)=sin(cos(x)^3) sind auch wirklich was fürs auge ;)

da könnt man noch graphisch als Bildschirmschoner was draus machen :)

aber genial!!!

Daniel G 5. Jun 2005 00:30

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Mal so 'ne blöde Frage: Ist das Koordinatensystem (und dessen Darstellung, verschiebbarkeit usw..) aus dem Beispiel komplett selbsterstellt oder ist das 'ne fertige Komponente?

Wenn es eine Komponente ist:
Wo bekomme ich die her?

Wenn es selbst gemacht ist:
Wann wird das Programm Open-Source? :mrgreen:

tyberis 5. Jun 2005 08:52

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Ne ich hab alles selbst geschrieben. Hab keine externen Komponenten überhaupt auf meinem Rechner installiert...
Open-Source wird es vielleicht aber nie, sonst wäre er jetzt schon dort. Müsste dann halt den Code ein wenig aufräumen. ;)

Nils_13 5. Jun 2005 09:20

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
:shock: Hammer hart :thumb:

Daniel G 5. Jun 2005 10:03

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Zitat:

Zitat von tyberis
Ne ich hab alles selbst geschrieben. Hab keine externen Komponenten überhaupt auf meinem Rechner installiert...
Open-Source wird es vielleicht aber nie, sonst wäre er jetzt schon dort. Müsste dann halt den Code ein wenig aufräumen. ;)

Och schade :cry:

PierreB 5. Jun 2005 10:14

Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
 
Zitat:

Open-Source wird es vielleicht aber nie,
Du weißt aber schon das es in die Open Source Sparte gepostet hast ? :P

Ich schließe mich den anderen an, wirklich gut der Farbmixer. :thumb:

Ich wollt mir grad noch das andere runterladen aber irgendwie is deine Homepage down... :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
Seite 1 von 2  1 2      

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