AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Parser/Compiler für mathematische Ausdrücke (inkl.Var.&Fkt.)
Thema durchsuchen
Ansicht
Themen-Optionen

Parser/Compiler für mathematische Ausdrücke (inkl.Var.&Fkt.)

Ein Thema von tyberis · begonnen am 18. Mär 2005 · letzter Beitrag vom 3. Mär 2006
Antwort Antwort
Seite 2 von 2     12   
tyberis
Registriert seit: 18. Mär 2005
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
 
tyberis
 
#11
  Alt 5. Jun 2005, 10:46
Hmm, ja, ist unter Open Source.. Aber es geht ja um den Parser, und der ist Open Source. Die zwei Programme sind halt nur als Demos da, zum Zeigen was damit entwickelt wurde.
Die Downloads gehen bei mir ...
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

 
Delphi 2006 Enterprise
 
#12
  Alt 3. Mär 2006, 11:08
Die Seite ist down...

Was ist denn los?

CK_CK
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22: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