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/)
-   -   Der HAM-Parser (https://www.delphipraxis.net/59668-der-ham-parser.html)

Dax 26. Dez 2005 22:42


Der HAM-Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Huhu :)

Ich hab wieder zugeschlagen ^^ und noch einen Matheparser gebaut ;)

Das Ding heißt HAM (fragt nicht wofürs steht, ich muss mir noch was einfallen lassen :mrgreen:) und ist mal wieder meinem Perfektionismus entsprungen. Der ECQP war einfach nicht so ganz das wahre, also hab ich den gebaut. (Und weil ich quasi versprochen habe, es zu tun ^^)

Also dann.. Ein Archiv sagt mehr als tausend Worte, oder? Eins mit dem gesamten Sourcecode (jämmerlich kommentiert) und (bis jetzt) drei Demos (ganz schön schön kommentiert :)) ist im Anhang. Weitere Demos, unter anderem zu den Plugins (:mrgreen:) werden noch Folgen.

*SCHINKEN zum zerfleddern bereit hinstell* (warum denkt ihr bei dem Namen auch immer ans essen? ;-))

DGL-luke 26. Dez 2005 22:49

Re: Der HAM-Parser
 
da fehlt offenbar Simpleoperators.pas.....

dizzy 26. Dez 2005 22:54

Re: Der HAM-Parser
 
Ich hab das Monster noch nicht getestet, aber ein wenig im Code gestöbert. Und ich finde allein schon den Variablennamen "_" sowas von geil :lol:

Ich hoffe das Ding läuft unter D7...

Dax 26. Dez 2005 22:57

Re: Der HAM-Parser
 
Zitat:

Zitat von DGL-luke
da fehlt offenbar Simpleoperators.pas.....

:oops: Die hab ich vergessen einzutüten. Jetzt isse aber drin :)

Daniel G 26. Dez 2005 23:32

Re: Der HAM-Parser
 
Ja, was HAMma denn da? *schenkelklopfer, hahaha.. :mrgreen: *

Nee, muss schon sagen, sieht wieder mal ganz nice aus...

Daniel G 26. Dez 2005 23:37

Re: Der HAM-Parser
 
Zitat:

[Fataler Fehler] HAM_Base.pas(283): F2039 Ausgabedatei 'E:\DevEnv\Delphi-Files\DCU\HAM_Base.dcu' kann nicht erstellt werden
Öhm.... Dax? Ich wollte Demo1 kompillieren. E:\ is nur leider mein DVD - Laufwerk...

=> HAM - Parser = Highly Accurate Mathematical Parser? (also, wenn er denn funktioniert...)

//Edit: Aaaargh... Ich wollte doch editieren, und keinen neuen Post...

Dax 26. Dez 2005 23:40

Re: Der HAM-Parser
 
Oha. Lösch mal die .bdsproject, dann müsste es gehen.

*schnell korrigier*

Daniel G 26. Dez 2005 23:47

Re: Der HAM-Parser
 
Ah, wunnerbar...

Dax 27. Dez 2005 00:02

Re: Der HAM-Parser
 
Zitat:

Zitat von Daniel G
Ah, wunnerbar...

Wie gefällts? ;-)

Dax 27. Dez 2005 21:23

Re: Der HAM-Parser
 
So, neues Archiv mit zwei neuen Demos (zu den Plugins) ist im ersten Beitrag :)

Daniel G 28. Dez 2005 10:42

Re: Der HAM-Parser
 
Zitat:

Zitat von Dax
Zitat:

Zitat von Daniel G
Ah, wunnerbar...

Wie gefällts? ;-)

Großartig! Samma', kann es sein, dass du Douglas Adams auch so gerne liest wie ich? :stupid:

Dax 28. Dez 2005 12:46

Re: Der HAM-Parser
 
Zitat:

Zitat von Daniel G
Großartig! Samma', kann es sein, dass du Douglas Adams auch so gerne liest wie ich? :stupid:

Das könnt sogar gut sein ;)

PS: Neue Version ist im ersten Beitrag. Irgendwie war da ein kleiner Fehler bei Operatoren, die unterschiedlichen Typs aber gleichen Namens sein sollten: Man konnt sie nicht registrieren. Aber jetzt gehts, das unäre Minus als Negator (:mrgreen:) ist jetzt auch in einer der Demos drin :)

Daniel G 28. Dez 2005 13:32

Re: Der HAM-Parser
 
Was genau bringt mir jetzt eigentlich die Möglichkeit, Plugins zu schreiben?

P.S.: Und was ist jetzt eigentlich mit meinem Namensvorschlag?

Dax 28. Dez 2005 13:37

Re: Der HAM-Parser
 
Zitat:

Zitat von Daniel G
Was genau bringt mir jetzt eigentlich die Möglichkeit, Plugins zu schreiben?

Die Plugins bieten eine einfache Möglichkeit, den Parser um eigene Funktionen zu erweitern. So hab ich zum Beispiel ein Plugin in Planung, das wie der ECQP den Ausdruck kompiliert. Natürlich kannst du mit Plugins auch andere Sachen machen, zum Beispiel ne eigene Variablenverwaltung oder jedes Vorkommen von "ä" im Ausdruck durch "ae" ersetzen :lol: Aber eigentlich ists zur Funktionserweiterung gedacht. Wenn jemand eine Idee hat, wo man noch mit Plugins ansetzen könnte, immer her damit :)

Zitat:

Zitat von Daniel G
P.S.: Und was ist jetzt eigentlich mit meinem Namensvorschlag?

Ich hab mich mittlerweile durchgerungen, doch Have another Maththingy zu benutzen.. Die Genauigkeit des Parser ist ja nach wie vor durch den verwendeten Datentyp beschränkt ^^

Dust Signs 28. Dez 2005 13:38

Re: Der HAM-Parser
 
Könntest du nicht auch eine EXE onlinestellen, damit man gleich testen kann, ohne Delphi anwerfen zu müssen? Thx

Dust Signs

Daniel G 28. Dez 2005 13:48

Re: Der HAM-Parser
 
Zitat:

Zitat von Dax
Aber eigentlich ists zur Funktionserweiterung gedacht. Wenn jemand eine Idee hat, wo man noch mit Plugins ansetzen könnte, immer her damit :)

Also z.B. ein Plugin, das mir die Ableitung (erste, zweite...) einer Funktion ermittelt?

Dax 28. Dez 2005 16:17

Re: Der HAM-Parser
 
Zitat:

Zitat von Daniel G
Also z.B. ein Plugin, das mir die Ableitung (erste, zweite...) einer Funktion ermittelt?

Klar ginge das :) Da der Parser intern den Ausdruck sowohl als Tokenstrom als auch als Baum speichert (wenn man ihn lässt), sollte das ohne Probleme gehen.

Als Beispiel den Baum für, sagen wir, 2*f(x^2) (nur die Node-Typen der einzelnen Teile des Baums):
Code:
ntVariable ntOperator ntFunction ntParameters
                                 +ntParameter
                                  +ntVariable ntOperator ntVariable
Auf diesen Baum kann man jetzt, nachdem der Baum erstellt wurde, voll zugreifen und nach gutdünken alles lesen und verändern, je nachdem was man vorhat. Den Presolver für diesen Parser wollte ich eigentlich als Plugin schreiben, und mit dem Baum dürfte das alles auch sehr einfach sein :)

edit: Rechtschreibfehler werden wieder einkassiert :mrgreen:

BlackJack 4. Jan 2006 12:08

Re: Der HAM-Parser
 
hey das teil sieht ja mal ganz interessant aus. kann der parser auch formeln kompilieren?

p.s.: ich schreibe ja im moment an meinem raytracer, und jetzt bin ich gerade dabei, mit XML einen parser dafür zu basteln. meinst du ich könnte deine Klasse benutzen, um auch Matheformeln parsen/kompilieren zu können? und kann man dafür besser diesen parser hier benutzen oder den anderen, den du im 1. post angesprochen hast?

edit:
und kann man dem parser auch mittels eines plugins oder so die unterstüzung von vektoren beibringen?

Dax 4. Jan 2006 12:11

Re: Der HAM-Parser
 
Formeln kompilieren kann dieser Parser noch nicht, aber ich habe vor, ein Plugin zu schreiben, dass genau das tut :) Wenn du ein wenig warten kannst, könnte ich dir es in ein paar Tagen vielleicht schicken oder auch hier posten, je nachdem wie lange ich brauch und obs noch andere Leute interessiert :)

Add: Dazu brauchst du keine Plugins, dazu musst du nur die Felder der TVariable ein wenig ändern und in Funktionen entsprechend nutzen :)

Dax 6. Jan 2006 01:52

Re: Der HAM-Parser
 
Ha, x86-Assembler is da :mrgreen:

Registriert den Assembler im Parser so:
Delphi-Quellcode:
MyAssembler := THAMAssemblerPlugin(Parser.AddPlugin(THAMAssemblerPlugin, [etAfterParse, etEval]);
Dadurch assembliert der Parser (oder besser das Plugin) den Ausdruck automatisch nach dem Parsen und beim Aufruf von .Eval() wird das Kompilat aufgerufen.

Statt .Eval() nutzt ihr besser das:
Delphi-Quellcode:
var
  MyFunc: THAMAssembledMethod;

MyFunc := MyAssembler.Assembly;

//lösen einfach durch Aufruf:
WriteLn(MyFunc.Value:2:2);
Ist dann ca doppelt sie schnell wie das normale Eval() ;)

Aber Achtung: Rückgabewerte des Kompilats sind keine eigene Objekte wie beim normalen lösen, sondern nur Referenzen auf die Lösung!

Edit: Das Plugin ist ab jetzt im Archiv im ersten Posting.

Edit 2: etEval bitte nicht mehr benutzen, das führt komischerweise zu EInvalidPointer-Exceptions, deren Urpsrung ich einfach nicht lokalisieren kann. Besides: direkt die Funktion aufzurufen ist eh nen Tick schneller ;)

Dax 13. Jan 2006 17:30

Re: Der HAM-Parser
 
So, neue Version hochgeladen. Die alte hatte zwei kleine Fehler, hier ein danke an BlackJack :)

arbu man 13. Jan 2006 17:48

Re: Der HAM-Parser
 
Hab mir grad die neuste Version herruntergeladen und wollte mir eine Demo anschauen. Ich hab nur so die Demo 4 gewählt
und schwupss kommt die Meldung:
Code:
[Fehler] LoggerPlugin.pas(26): Deklaration von 'GetOperator' unterscheidet sich von vorheriger Deklaration
:(

Nachtrag: Alle anderen Demos funktionieren. Warum hab ich nur die als erstes gewählt. :wall:

Dax 13. Jan 2006 17:57

Re: Der HAM-Parser
 
Oh sorry, da waren die alten Demos noch dabei. Hab mal neue hochgeladen ^^

toms 13. Jan 2006 18:16

Re: Der HAM-Parser
 
Schade ist keine Exe-Demo dabei.

---Bernhard--- 13. Jan 2006 23:47

Re: Der HAM-Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Ich hab die Funktionsweise jetzt mal getestet und finde den Code recht gut :-)
Jedoch wird anscheinend Punkt vor Strich nicht berücksichtigt :(

Zum testen habe ich ein Demoprojekt genommen (das erste), wo die Priority's ja stimmen sollten.

Entweder stimmt was in deinem Code nicht oder ich hab übersehen irgendwas einzustellen.

Im Anhang ist das Projekt um das Problem zu verdeutlichen

Dax 14. Jan 2006 00:39

Re: Der HAM-Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das kann ich jetzt allerdings garnicht nachvollziehen...

---Bernhard--- 14. Jan 2006 10:45

Re: Der HAM-Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Stimmt, bei deiner EXE kommt das richtige Ergebniss raus...

Ich habe die Demodateien und den Source grad nochmal unverändert geladen und kompiliert, es kommt aber wieder das falsche Ergebniss 200 raus :?
Hab mir zuerst gedacht, dass es evtl. an Delphi 2006 liegt. Hab aber nochmal alles mit Delphi7 kompiliert und es kommt zum selben Problem. :-(

Was bekommen denn die anderen bei der Demo raus? Hat irgendwer den gleichen Fehler oder hab nur ich das Problem?? (Es muss 158 rauskommen, nicht 200!)


PS: Folgende Fremdkomponenten sind installiert: Die Jedis und DelphiX (neueste Versionen)

Dax 14. Jan 2006 11:31

Re: Der HAM-Parser
 
So, ich eben mal wieder meine Source-Verzeichnis hochgeladen, mit dem bei mir alles funktioniert hat. Gehts bei dir mit den (neuen?) Sourcen immer noch nicht?

---Bernhard--- 14. Jan 2006 11:37

Re: Der HAM-Parser
 
Zitat:

Zitat von Dax
So, ich eben mal wieder meine Source-Verzeichnis hochgeladen, mit dem bei mir alles funktioniert hat. Gehts bei dir mit den (neuen?) Sourcen immer noch nicht?

Aja, super, jetzt geht es! :-):-):-) War wohl doch noch ein Fehler im Source ;)

Dax 14. Jan 2006 11:39

Re: Der HAM-Parser
 
Tja, da hab ich wohl einfach vergessen das neuste hochzuladen :)

arbu man 24. Jan 2006 21:01

Re: Der HAM-Parser
 
Hab deinen Parser mal für 2 kleinere Projekte eingesetzt.
Mir ist dabei auf gefallen:

- Der parser abeitet schnell ( Rechnungen in 15s :thumb: )
- Das mit dem Variablen hinzufügen ist etwas gewöhungs bedürtig.

Es sollte vieleicht noch eine funktion geben wie
Delphi-Quellcode:
function isvarset(name: string): boolean;
begin
  if Parser.VariableByName[name]<> nil then begin
    result:=true;
  end else begin
    result:=false;
  end;
end;
oder ein procedure die eine variable mit einen wert setzt und sollte diese noch nicht erstellt sein diese auch erstellt.

Was mich noch interessieren würde was genau ist das x86-Assembler-Plugin ? :gruebel:

3_of_8 24. Jan 2006 21:07

Re: Der HAM-Parser
 
15s? War das ein Tippfehler oder ironisch?

Dax 24. Jan 2006 21:11

Re: Der HAM-Parser
 
Zitat:

Zitat von arbu man
Es sollte vieleicht noch eine funktion geben wie
Delphi-Quellcode:
function isvarset(name: string): boolean;
begin
  if Parser.VariableByName[name]<> nil then begin
    result:=true;
  end else begin
    result:=false;
  end;
end;

Hmm, okay.. Werde ich im nächsten Update einbauen :)


Zitat:

Zitat von arbu man
as mich noch interessieren würde was genau ist das x86-Assembler-Plugin ? :gruebel:

Na ein Plugin, das aus der geparsten Formel Assemblercode erstellt ;-) Läuft meistens fast doppelt so schnel.


Zitat:

Zitat von 3_of_8
15s? War das ein Tippfehler oder ironisch?

Borgli? Is der bei dir so schnarchlahm? ;)

arbu man 24. Jan 2006 21:18

Re: Der HAM-Parser
 
Zitat:

Na ein Plugin, das aus der geparsten Formel Assemblercode erstellt Wink Läuft meistens fast doppelt so schnel.
Klingt nicht schlecht.

oh :mrgreen: hab doch glatt vergessen zu schreiben das es nicht eine rechung war sondern 512² Rechnungen und nicht grade einfache rechnungen.

Dax 24. Jan 2006 21:20

Re: Der HAM-Parser
 
Zitat:

Zitat von arbu man
oh :mrgreen: hab doch glatt vergessen zu schreiben das es nicht eine rechung war sondern 512² Rechnungen und nicht grade einfache rechnungen.

Zeich mal her was man mit dem Teil so schönes verbrechen kann :)

arbu man 25. Jan 2006 17:41

Re: Der HAM-Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zeich mal her was man mit dem Teil so schönes verbrechen kann
Ne ganze Menge AVs produzieren :mrgreen:

Nee alle AVs hab ich heute aus dem prog verbannt.
Naja ist nach nicht ganz fertig aber was anzeigen kann.

cos(z*12)/(2*(z*6.28+1)) , tan(x*y) oder pi+x+y+z-3 sind ganz nett

Dax 25. Jan 2006 17:44

Re: Der HAM-Parser
 
Zitat:

Zitat von arbu man
Ne ganze Menge AVs produzieren :mrgreen:

:shock: Ich hoffe an denen bist du Schuld ;)

Zitat:

Zitat von arbu man
Naja ist nach nicht ganz fertig aber was anzeigen kann.

cos(z*12)/(2*(z*6.28+1)) , tan(x*y) oder pi+x+y+z-3 sind ganz nett

Ja, sieht toll aus :thumb: Bin mal auf die Endversion gespannt ;-)

arbu man 25. Jan 2006 17:54

Re: Der HAM-Parser
 
Zitat:

Zitat von Dax
:shock: Ich hoffe an denen bist du Schuld ;)

Ja, man sollte halt nicht in einen array schreiben wenn dieser keinen Speicher dazu hat :mrgreen:

---Bernhard--- 7. Feb 2006 21:21

Re: Der HAM-Parser
 
Hallo.

Habe gerade noch ein Problem festgestellt!

Folgende Funktion geht tadellos:
x^2+1

Jedoch macht folgende Probleme:
x^(2)+1

Es wird stattdessen die Funktion "x^3" verwendet!

Wie kann ich das Problem am besten umgehen?

Mein Code für die Operatorendefinition lautet so:
Delphi-Quellcode:
class procedure THAMSimpleOperators.RegToParser(Parser: THAMParser);
begin
  with Parser do
  begin
    THAMSimpleOperators(AddOperator('+', otBinary, 1, Self)).fType := 1;
    THAMSimpleOperators(AddOperator('-', otBinary, 1, Self)).fType := 2;
    THAMSimpleOperators(AddOperator('*', otBinary, 2, Self)).fType := 3;
    THAMSimpleOperators(AddOperator('/', otBinary, 2, Self)).fType := 4;
    THAMSimpleOperators(AddOperator('^', otBinary, 3, Self)).fType := 10;

    THAMSimpleOperators(AddOperator('-', otunaryPrefix, 1, Self)).fType := 0;
    THAMSimpleOperators(AddOperator('+', otunaryPrefix, 1, Self)).fType := 20;

    // change EvalDir from LeftToRight(2^2^3 -> (2^2)^3) to RightToLeft(2^2^3 -> 2^(2^3)) for the Power-Operator
    OperatorByName['^'].EvalDir := edRightToLeft;
  end;
end;

procedure THAMSimpleOperators.Call(const Args: THAMVariableArray;
  const Result: THAMVariable);
begin
  case fType of
    1: Result.Value := Args[0].Value + Args[1].Value;
    2: Result.Value := Args[0].Value - Args[1].Value;
    3: Result.Value := Args[0].Value * Args[1].Value;
    4: Result.Value := Args[0].Value / Args[1].Value;

    10: Result.Value := Power(Args[0].Value, Args[1].Value);

    0: Result.Value := -Args[0].Value;
    20: Result.Value := Args[0].Value;
  end;
end;
:hi:

Dax 7. Feb 2006 21:37

Re: Der HAM-Parser
 
Neue Version in der das nicht mehr passieren sollte ist hochgeladen..


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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