![]() |
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? ;-)) |
Re: Der HAM-Parser
da fehlt offenbar Simpleoperators.pas.....
|
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... |
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
Ja, was HAMma denn da? *schenkelklopfer, hahaha.. :mrgreen: *
Nee, muss schon sagen, sieht wieder mal ganz nice aus... |
Re: Der HAM-Parser
Zitat:
=> HAM - Parser = Highly Accurate Mathematical Parser? (also, wenn er denn funktioniert...) //Edit: Aaaargh... Ich wollte doch editieren, und keinen neuen Post... |
Re: Der HAM-Parser
Oha. Lösch mal die .bdsproject, dann müsste es gehen.
*schnell korrigier* |
Re: Der HAM-Parser
Ah, wunnerbar...
|
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
So, neues Archiv mit zwei neuen Demos (zu den Plugins) ist im ersten Beitrag :)
|
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
Zitat:
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 :) |
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? |
Re: Der HAM-Parser
Zitat:
Zitat:
|
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 |
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
Zitat:
Als Beispiel den Baum für, sagen wir, 2*f(x^2) (nur die Node-Typen der einzelnen Teile des Baums):
Code:
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 :)
ntVariable ntOperator ntFunction ntParameters
+ntParameter +ntVariable ntOperator ntVariable edit: Rechtschreibfehler werden wieder einkassiert :mrgreen: |
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 ![]() edit: und kann man dem parser auch mittels eines plugins oder so die unterstüzung von vektoren beibringen? |
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 :) |
Re: Der HAM-Parser
Ha, x86-Assembler is da :mrgreen:
Registriert den Assembler im Parser so:
Delphi-Quellcode:
Dadurch assembliert der Parser (oder besser das Plugin) den Ausdruck automatisch nach dem Parsen und beim Aufruf von .Eval() wird das Kompilat aufgerufen.
MyAssembler := THAMAssemblerPlugin(Parser.AddPlugin(THAMAssemblerPlugin, [etAfterParse, etEval]);
Statt .Eval() nutzt ihr besser das:
Delphi-Quellcode:
Ist dann ca doppelt sie schnell wie das normale Eval() ;)
var
MyFunc: THAMAssembledMethod; MyFunc := MyAssembler.Assembly; //lösen einfach durch Aufruf: WriteLn(MyFunc.Value:2:2); 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 ;) |
Re: Der HAM-Parser
So, neue Version hochgeladen. Die alte hatte zwei kleine Fehler, hier ein danke an BlackJack :)
|
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: |
Re: Der HAM-Parser
Oh sorry, da waren die alten Demos noch dabei. Hab mal neue hochgeladen ^^
|
Re: Der HAM-Parser
Schade ist keine Exe-Demo dabei.
|
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 |
Re: Der HAM-Parser
Liste der Anhänge anzeigen (Anzahl: 1)
Das kann ich jetzt allerdings garnicht nachvollziehen...
|
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) |
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?
|
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
Tja, da hab ich wohl einfach vergessen das neuste hochzuladen :)
|
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:
oder ein procedure die eine variable mit einen wert setzt und sollte diese noch nicht erstellt sein diese auch erstellt.
function isvarset(name: string): boolean;
begin if Parser.VariableByName[name]<> nil then begin result:=true; end else begin result:=false; end; end; Was mich noch interessieren würde was genau ist das x86-Assembler-Plugin ? :gruebel: |
Re: Der HAM-Parser
15s? War das ein Tippfehler oder ironisch?
|
Re: Der HAM-Parser
Zitat:
Zitat:
Zitat:
|
Re: Der HAM-Parser
Zitat:
oh :mrgreen: hab doch glatt vergessen zu schreiben das es nicht eine rechung war sondern 512² Rechnungen und nicht grade einfache rechnungen. |
Re: Der HAM-Parser
Zitat:
|
Re: Der HAM-Parser
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 |
Re: Der HAM-Parser
Zitat:
Zitat:
|
Re: Der HAM-Parser
Zitat:
|
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:
:hi:
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; |
Re: Der HAM-Parser
Neue Version in der das nicht mehr passieren sollte ist hochgeladen..
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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