2008-08-26 10 views
10

Wir möchten benutzerdefinierte Formeln in unserem C++ - Programm haben. z.B. Der Wert v = x + (y - (z - 2))/2. Später im Programm würde der Benutzer x, y und z definieren -> das Programm sollte das Ergebnis der Berechnung zurückgeben.
Irgendwann später könnte die Formel geändert werden, also sollte das Programm das nächste Mal die Formel analysieren und die neuen Werte hinzufügen.

Irgendwelche Ideen/Hinweise, wie man so etwas macht?

Bisher kam ich einfach zu der Lösung, einen Parser zu schreiben, um diese Formeln zu berechnen - vielleicht irgendwelche Ideen dazu?Berechnung von benutzerdefinierten Formeln (mit C++)

Antwort

3

Wenn es häufig verwendet wird und wenn es in der Zukunft erweitert wird, würde ich fast empfehlen, Python oder LUA in Ihrem Code hinzuzufügen. LUA ist eine sehr einfache Skriptsprache, in die Sie sich einklinken und neue Funktionen, Operatoren usw. bereitstellen können. Wenn Sie robustere und kompliziertere Dinge tun möchten, verwenden Sie stattdessen Python.

0

Verwenden Sie Spirit (zum Beispiel) zu analysieren (und die 'semantischen Aktionen', die es bietet, um einen Ausdrucksbaum zu konstruieren, den Sie dann manipulieren, z. B. auswerten können), scheint eine ziemlich einfache Lösung zu sein. Sie können zum Beispiel eine Grammatik für arithmetische Ausdrücke there finden, wenn es nötig ist ... (es ist ziemlich einfach, Ihre eigenen zu finden).

Hinweis: Spirit ist sehr einfach zu lernen, und ziemlich für solche Aufgaben angepasst.

0

Es gibt im Allgemeinen zwei Möglichkeiten, es zu tun, mit drei möglichen Implementierungen:

  1. wie Sie auf sich selbst berührt haben, eine Bibliothek Formeln zu bewerten
  2. die Formel in Code kompilieren

Die zweite Möglichkeit besteht hier normalerweise darin, etwas zu kompilieren, das als eine Art Plugin geladen werden kann, oder es kann in ein separates Programm kompiliert werden, das dann aufgerufen wird und die notwendige Ausgabe erzeugt.

Für C++ würde ich vermuten, dass eine Bibliothek für die Auswertung wahrscheinlich irgendwo existieren würde, damit ich anfangen würde.

0

Wenn Sie eine eigene schreiben möchten, suchen Sie nach „formalen Automaten“ und/oder „Finite State Machine Grammatik“

Im Allgemeinen, was Sie tun, ist die Zeichenfolge analysieren, auf einem Stapel Zeichen drängen, wie Sie gehen . Starten Sie dann das Auslösen der Zeichen und führen Sie Tasks basierend auf dem Inhalt aus. Es ist einfacher zu codieren, wenn Sie Gleichungen zur Umkehrpolitur-Notation zwingen.

1

Sie können Ihre Formel als einen Baum von Operationen und Unterausdrücken darstellen. Sie möchten möglicherweise Typen oder Konstanten für Operationstypen und Variablen definieren.

Sie können dann schreiben leicht genug, um eine Methode, die den Baum recurses durch, um die entsprechenden Vorgänge anwenden, was auch immer Werte, die Sie in geben.

0

Ihr Leben einfacher zu machen, ich denke, diese Art der Eingabe immer am besten durch getan wird eine GUI, wo Benutzer in was sie eingaben eingeschränkt werden können.

Wenn Sie planen, es über die Befehlszeile (das ist die Impression, die ich von Ihrem Beitrag), dann sollten Sie wahrscheinlich eine strenge Reihe von zulässigen Eingaben definieren (zB nur einzelne Buchstaben Variablen, kein Leerzeichen und nur bestimmte mathematische Symbole:() + - */etc.).

Dann müssen Sie:
Lesen im Eingangs char-Array
Parse es um eine Liste von Variablen aufzubauen und Aktionen
diese Aktionen durchführen - in BOMDAS um

1

Bauen Sie Ihre eigenen Parser für diese sollte ein Straight-Forward-Betrieb sein:

) die Gleichung von Infix zu Postfixnotation konvertieren (eine typische compsci Zuordnung) (ich einen Stapel verwenden würde) ) warten, um die Werte, die Sie wollen ) Pop-up den Stapel der Infix-Elemente, den Wert für die Variable in, wo erforderlich ) Display-Ergebnisse

0

Mit ANTLR können Sie einen Parser/Compiler erstellen, der die Benutzereingabe interpretiert, führen Sie dann die Berechnungen mit dem Visitor-Muster. A good example is here, aber es ist in C#. Sie sollten in der Lage sein, es schnell an Ihre Bedürfnisse anzupassen und weiterhin C++ als Ihre Entwicklungsplattform zu verwenden.

Verwandte Themen