Laden...

Formel parsen

Erstellt von T-Man vor 17 Jahren Letzter Beitrag vor 16 Jahren 9.959 Views
T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 17 Jahren
Formel parsen

Hallo Leute,

ich habe Formeln in strings in folgendem Stil:

f1 = "2a+3b-20";
f2 = "3*(a/10+b/10)";

Meine Klasse hat Werte für a und b (Als Beispiel a=12, b=10). Alles int.
Ich ersetze nun in den Strings (f1 und f2) die Zeichen a und b durch die entsprechenden Werte. (Evtl. fehlende Multiplikationsoperatoren werden natürlich nicht vergessen. Aus 2a wird natürlich 2*12 und nicht 212.)
Was ich dann habe sind strings wie

f1 = "212+310-20";
f2 = "3*(12/10+10/10)";

Nun will ich das Ergebnis der Formel haben. Gibt es dafür einen fertigen Parser, oder muß ich mir den selber schreiben?

int erg1 = FormelParser(f1);

Gruß,
Tony

P.S.: Habe gesucht und nix gefunden. Falls es die Frage doch schonmal (so ählich) gab, bitte ich mein schwaches Suchvermögen zu entschuldigen.

564 Beiträge seit 2006
vor 17 Jahren

Hi!

Mir wäre jetzt soetwas nicht bekannt.

Habe gerade ein bißchen überlegt, wie du es machen müsstest. Eine zu überlegende Sache ist das Verschachteln der Formelm mit Klammern. Dies könnte man evtl so lösen, dass jede Formelebene (ich hoffe du weißt, was ich meine) mittels einer Klasse repräsentiert wird, welche verschiedene Listen inne hat, wobei jede Liste eine bestimmte Grundrechenart repräsentiert. Diese Listen enthalten entweder Zahlen oder (wenn wieder eine Klammer an der Stelle ist) ein neues Formelobjekt.
Über die genaue Syntax müsste natürlich noch diskutiert werden. Das könnte aber vielleicht ein grober Ansatz für die Herangehensweise sein.

der Marcel 🙂

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
4.644 Beiträge seit 2004
vor 17 Jahren

Schau mal hier, vielleicht hilft Dir das.

564 Beiträge seit 2006
vor 17 Jahren

Hi Noodles!

Wow...Das werd ich mir auch mal genauer ansehen 8)

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

M
1.439 Beiträge seit 2005
vor 17 Jahren

Hi,
ich hab mal so was gemacht, kannst es verwenden.

lg
georg

N
4.644 Beiträge seit 2004
vor 17 Jahren

Original von der Marcel
Wow...Das werd ich mir auch mal genauer ansehen 8)

Klar. Ich habe aber keine Anteile daran, sondern cdr. 😉

T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 17 Jahren

Vielen Dank für die Tips.

Gruß,
T-Man

S
8.746 Beiträge seit 2005
vor 17 Jahren
22 Beiträge seit 2004
vor 17 Jahren

Hallo!

Ein bißchen Eigenwerbung schadet nie:

http://www.codeproject.com/useritems/MathParser.asp

Servus...
Paratrooper.

369 Beiträge seit 2006
vor 16 Jahren

Vor einiger Zeit habe ich einen Formelparser geschrieben, der beliebige Formeln analysiert und intern als "Umgekehrte Polnische Notation" (UPN) darstellt (Vielleicht besser bekannt als Infix-Notation oder "Reverse Polish Notation" - RPN). Die Speicherung erfolgt natürlich nicht als Abfolge von Zeichen oder Strings, sondern der Term wird in "Tokens" zerlegt. Das sind Klassen bzw. Unterklassen, die etwa bei Operatoren auch gleich deren Implementierung umfassen - verzichtet habe ich allerdings auf die Vereinfachung der Terme.

... herunterladen kannst du die Borland Package Library (BPL) einschließlich Beispielanwendung hier: http://www.epifiles.de/daten/index.php?N=A&dir=epiSource%2FDelphi%2FMathExpression

Wie du vielleicht schon am Begriff BPL gemerkt hast, handelt es sich jedoch nicht um .Net sondern um Delphi (war damals für den Schulunterricht) - vielleicht hilft es dir dennoch weiter.

Die Zip-Datei enthalt drei Ordner:

  1. MathExpression: Die BPL ("Klassenbibliothek"), welche die eigentliche Funktion zur Verfügung stellt. Für dich interessant sind vor allem die Quellcode-Dateien MathExpression.pas und Tokens.pas

  2. MathExpressionBPLSample: Beispielanwendung, die auf obige BPL aufbaut.

  3. MathExpressionSample: Wie MathExpressionBPLSample, allerdings wird die Funktionalität der BPL direkt eingebunden.

Die Dokumentation kann ich leider nicht mehr finden, vielleicht habe ich auch nie eine geschrieben.

PS: Ich halte einen eigenständigen Parser für die bessere Lösung. Der zuvor verlinkte Artikel (http://www.codeproject.com/cs/algorithms/matheval.asp) beschreibt zwar eine sehr simple wie auch elegante Lösung, die bei falscher Umsetzung allerdings schwerwiegende Sicherheitslücken schafft.

2.921 Beiträge seit 2005
vor 16 Jahren

Es geht auch viel einfacher:

Formeleditor

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.