Parser für polynomielle Ausdrücke

Neue Frage »

Auf diesen Beitrag antworten »
InformaTiger Parser für polynomielle Ausdrücke

Hallo,

ich bastle derzeit an einem simplen Parser und Evaluator für polynomielle Ausdrücke. Mein derzeitiger Stand erlaubt nur das Parsen eines einzelnen Ausdrucks aufgrund des statischen Konzepts meines Parsers.

Ich habe aber leider keine Idee wie ich das Modell ändern könnte, dass er mehrere Ausdrücke zusammen parsen kann. Hat jemand Tipps für mich?

edit: unterstützte Operatoren sind nur plus, mal, minus und Potenzen. Des weiteren sind alle Operatoren explizit hinzuschreiben (bspw. 3x ist ungültig).

Danke schon im voraus smile

Mit freundlichen Grüßen
InformaTiger

PS: Quellcode befindet sich als NetBeans Projekt im Anhang
 
Auf diesen Beitrag antworten »
eulerscheZahl

Von den Tiefen meiner Festplatte, habe ich vor Jahren mal geschrieben.
Das kann Funktionen parsen, ableiten und für gegebene Variablen auswerten.

Edit:
du definierst dir ja eine richtige Grammatik, da hilft dir mein Code vermutlich nicht besonders.
Hier geht es zum Java Compilercode.
Auf diesen Beitrag antworten »
Karlito

Hallo InformaTiger

Da komme ich wahrscheinlich erst am WE dazu. Könntest du mal erläutern, was Du meinst? Wie soll deine Sprache aussehen? Was meinst Du mit mehreren Ausdrücken? Meinst Du eine Liste mit Polynomen?
(ich habe mir deinen Code noch nicht wirklich angeschaut)

Gruß,

Karlito
Auf diesen Beitrag antworten »
InformaTiger

Also, vielleicht irre ich mich auch mit der Terminologie etwas da ich sowas ansonsten nie mache, aber es sollte ungefähr so aussehen:

EBNF (vermutlich nicht ganz formal korrekt, da dies mein erster Versuch ist, das zu beschreiben was ich haben möchte)
code:
1:
2:
3:
4:
5:
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
integer = digit, { digit };
operator = "+" | "-" | "*" | "^";
variable = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z";
polynomial = digit | variable, operator, { polynomial }


Wie bereits erwähnt sollen alle Operationen explizit angegeben werden (z.B 3*x und nicht 3x). Erlaubt sind nur die Operatoren Plus, Mal, Minus und Hoch. Unter Ausdrücke verstehe ich folgendes:

code:
1:
2:
3^x // ein Ausdruck
3^x + 6 - 19 // mehrere Ausdrücke


Ich hoffe das machte es halbwegs verständlich, was mein Resultat sein sollte. Und für einen Ausdruck funktioniert das ganze ja auch, ich brauche nur noch die Möglichkeit, dass da als linke Rechenoperation auch ein Polynom bzw ein Ausdruck stehen kann, da ansonsten beispielsweise nur sowas gültig wäre:

code:
1:
2:
3^x 6 + 8 19 - 5 // derzeit gültig bzw. so falsch
3^x + 6 - 19 // mein Ziel bzw. richtig


smile

Mit freundlichen Grüßen
InformaTiger
 
Auf diesen Beitrag antworten »
InformaTiger

Hurray Tanzen

ich habe es mittlerweile geschafft den Parser so zu schrieben, dass er mehrere Ausdrücke parst und auch berechnet. Was ich allerdings außer Acht gelassen habe ist die Präzedenz bzw. die Priorität der Operatoren.

Ich hatte mir gedacht, die Ausdrücke in eine PriorityQueue zu packen und nach Priorität des Operators zu sortieren - was ich dabei aber nicht bedacht habe ist, dass dies an meiner Situation nicht wirklich etwas ändert. Hat jemand einen Tipp für mich wie ich die Ausdrücke so anordnen kann, dass Punkt vor Strich gilt (derzeit rechnet mein Evaluator einfach stur von links nach rechts)?

Ich hänge mal die neuen Sourcefiles in den Anhang.

edit: Polnische Notation sagt mir was bzw. ist allgemein als Schreibweise mathematischer Ausdrücke in der Informatik recht angesehen. Leider habe ich aber keine Ahnung wie ich die hier einbauen sollte Zunge raus

Mit freundlichen Grüßen
InformaTiger
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »