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