![]() |
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:
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.
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 Anwendungsbeispiel:
Delphi-Quellcode:
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.
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; Anwendungsbeispiel mit Interface-Wrapper:
Delphi-Quellcode:
Weitere Beispiele mit mehreren Variablen sind in der Source enthalten.
Var
SinC : IExpr1V; Result : Extended; begin SinC := compileStr1V('sin(x)/x'); Result := sinc.Eval(1.0); end; Download: Unit ![]() Demo Programme Download: Farbmix Parser-Demo: ![]() TyMathPlotter: ![]() Kommentare/Anregungen/Kritik zum Parser oder zu den Demoprogrammen erwünscht :) Gruss, Simon |
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. |
Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
Hammer :shock:
Wie gesagt, die Farbmixdemo geht richtig ab |
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. |
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!!! |
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: |
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. ;) |
Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
:shock: Hammer hart :thumb:
|
Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
Zitat:
|
Re: Parser/Compiler für mathematische Ausdrücke (inkl.Var.&a
Zitat:
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 12:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz