2009-02-27 4 views
3

Ich werde zuerst das Problem beschreiben und dann, was ich derzeit in Bezug auf Bibliotheken betrachten.Parser: Parsing Formeln in Template-Dateien

In meiner Anwendung haben wir eine Reihe von Variablen, die immer verfügbar sind. Zum Beispiel: TOTAL_ITEMS, PREIS, VERTRÄGE, ETC (wir haben ungefähr 15 von ihnen). Ein Client der Anwendung möchte bestimmte Berechnungen ausführen und anzeigen, die diese Variablen verwenden. Bis jetzt habe ich diese Berechnungen ständig zur App hinzugefügt. Es ist Schmerz in den Hintern, und ich möchte es allgemeiner machen, indem ich eine Schablone erstelle, wo der Benutzer eine Reihe von Formeln spezifizieren kann, die die Anwendung analysieren und berechnen wird. Hier

ist ein Fall:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS 

So etwas wie das für den Benutzer tun möchten, in der Template-Datei zu definieren:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS und einige Meta-Tag, wie Bildschirm, um sie anzuzeigen auf. Daher werden sie die Formel mit einem Bildschirm angeben. Und die Datei wird viele Formeln dieser Art enthalten. Recht

jetzt, ich bin auf der Suche zwei libraies: Spirit und matheval

Würde jemand Empfehlungen machen, was für diese Aufgabe besser ist, sowie Referenzen, Beispiele, Links?

Bitte lassen Sie mich wissen, wenn die Frage unklar ist, und ich werde versuchen, es weiter zu klären.

Danke,

Sasha

+0

Es sieht aus wie Matheval wurde in Euphorie geschrieben ... ist das ein Problem für Ihren Anwendungsfall? – joshperry

+0

Was ist das Problem damit? –

+0

Ich denke, das Hauptproblem ist, dass Sie Euphorie brauchen! :-) –

Antwort

0

Wenn Sie eine feste Anzahl von Variablen haben, ist es möglicherweise etwas übertrieben, einen Parser aufzurufen. Obwohl Spirit cool ist und ich es in einem Projekt verwenden wollte.

würde ich wahrscheinlich tokenize nur die Zeichenfolge, eine Karte Ihrer Variablen mit Namen eingegeben machen (vorausgesetzt, alle Variablen sind Ints):

map<const char*,int*> vars; 
vars["CONTRACTS"] = &contracts; 
... 

Dann eine einfache postfix Rechnerfunktion verwenden, um die tatsächlichen Mathematik zu tun.

Edit:

bei MathEval Blick scheint es, genau das zu tun, was Sie wollen; setze Variablen und bewerte mathematische Funktionen mit diesen Variablen. Ich bin nicht sicher, warum Sie eine Lösung auf der Ebene eines Syntaxparsers erstellen möchten. Haben Sie irgendwelche Anforderungen, die MathEval nicht erfüllt?

+0

gut, es könnte ein bisschen schwierig sein, da ich viele verschiedene Operatoren verwenden muss (- + * /) - Formel kann 30 Konstanten verwenden, einige könnten wiederholt werden. –

+0

Beide Bibliotheken erfüllen meine Anforderungen, soweit ich das beurteilen kann ... die Frage ist Erweiterbarkeit und Komplexität bei der Verwendung übereinander ... –

0

Sieht aus wie es nicht zu hart sein sollte, einen einfachen Parser mit yacc und bison und integrieren sie in Ihren Code zu generieren.

+0

Warum gehst du dann nicht auf Spirit? Ergebnisse in weniger Abhängigkeiten von externen Tools (Ich halte Spirit weniger extern als yacc und Freunde) – Anonymous

+0

Im Kontext von Geist gegen Yacc, würde ich sicherlich für Boost gehen. Ich sehe aber auch, dass Matheval leicht und für eine weniger komplizierte Grammatik einfacher zu benutzen ist. Danke –

0

Ich weiß nicht über Matheval, aber boost :: spirit kann das für Sie ziemlich effizient tun: siehe there.

Wenn Sie in der Vorlage Metaprogrammierung sind, möchten Sie vielleicht einen Blick in Boost::Proto, aber es wird nehmen Sie sich etwas Zeit, um zu beginnen, es zu verwenden.