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 1 von 2  1 2      
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
 
Robert_G
 
#2
  Alt 18. Mär 2005, 22:59
Das ist echt gut.
Vor allem die Farbmixdemo zeigt wie schnell das Ding arbeitet.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader
 
#3
  Alt 19. Mär 2005, 08:26
Hammer

Wie gesagt, die Farbmixdemo geht richtig ab
Ingo Bürk
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#4
  Alt 19. Mär 2005, 08:35
Hi,

das Ding ist ja echt genial .

Ich werde mir nachher mal die Unit ansehen, aber ich bezweile, dass ich überhaupt etwas davon verstehe.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon
 
#5
  Alt 19. Mär 2005, 08:37
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!!!
  Mit Zitat antworten Zitat
Daniel G
 
#6
  Alt 5. Jun 2005, 00:30
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?
  Mit Zitat antworten Zitat
tyberis
 
#7
  Alt 5. Jun 2005, 08:52
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.
  Mit Zitat antworten Zitat
Nils_13
 
#8
  Alt 5. Jun 2005, 09:20
Hammer hart
  Mit Zitat antworten Zitat
Daniel G
 
#9
  Alt 5. Jun 2005, 10:03
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
  Mit Zitat antworten Zitat
PierreB
 
#10
  Alt 5. Jun 2005, 10:14
Zitat:
Open-Source wird es vielleicht aber nie,
Du weißt aber schon das es in die Open Source Sparte gepostet hast ?

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

Ich wollt mir grad noch das andere runterladen aber irgendwie is deine Homepage down...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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