Frage

ich brauche algebraische Ausdrücke für eine Anwendung zu analysieren, auf ich arbeite und bin die Hoffnung, ein wenig kollektiven Weisheit zum Garnieren, bevor ein Riss an es zu nehmen und möglicherweise die falsche Straße hinunter.

Was ich tun muß, ist ziemlich geradlinig: Da ein textueller algebraischer Ausdruck (3 * x - 4 (y - sin (pi))) erstellen Sie eine Objektdarstellung der Gleichung. Die benutzerdefinierten Objekte bereits vorhanden ist, so dass ich einen Parser benötigen, die einen Baum schafft Ich kann gehen instanziiert die Objekte ich brauche.

Die grundlegenden Anforderungen wären:

  1. Die Fähigkeit, die Algebra als Grammatik zum Ausdruck bringen, so ich die Kontrolle habe und kann es als notwendig anpassen / erweitern.

  2. Die erste Syntax wird ganze Zahlen, reelle Zahlen, Konstanten, Variablen, arithmetische Operatoren (+, -, *, /) umfasst, die Befugnisse (^), Gleichungen (=), Klammer, Vorrang und einfache Funktionen ( sin (pi)). Ich hoffe, dass meine app ziemlich schnell zu Support-Funktionen selbst (f (x) = 3x + 2).

  3. erweitern
  4. muss in C kompiliert, wie es in meinen Code integriert werden muss.

Ich brauche nicht den Ausdruck mathematisch zu bewerten, so dass Software löst für eine Variable oder führt die arithmetische Rauschen ist.

Ich habe meine Google Hausaufgabe gemacht und es sieht aus wie der beste Ansatz ist es, eine BNF-Grammatik zu verwenden und Software einen Compiler in C. Also meine Fragen zu generieren:

  1. Gibt es eine BNF-Grammatik mit Parser-Generator für algebraische Ausdrücke entspricht (oder besser noch, LaTeX) gibt es bereits? Jemand muss dies bereits getan hat. Ich möchte wirklich zu vermeiden, meine eigenen Rollen, vor allem, weil ich es nicht testen möchten. Ich wäre bereit, einen angemessenen Betrag für eine Bibliothek zu zahlen (unter $ 50)

  2. Wenn nicht, der Parser-Generator für C denken Sie, die einfachste ist, hier zu lernen / Nutzung? Lex? YACC? Flex, Bison, Python / SymPy, andere? Ich bin mit diesen Substanzen nicht bekannt.

War es hilfreich?

Lösung

Ich habe sehr viel Glück gehabt mit ANTLR . Es hat Runtimes für viele verschiedene Sprachen, darunter C, und hat eine sehr schöne Syntax für Grammatiken und bauen Bäume angeben. Ich schrieb vor kurzem eine ähnliche Grammatik (algebraische Ausdrücke) in 131 Zeilen, die auf jeden Fall überschaubar ist.

Andere Tipps

Die Standard-Linux-Tools flex und Bison wäre wahrscheinlich am besten geeignet hier. IIRC die Probe Parser und Lexer in diesen Werkzeugen tun etwas in der Nähe zu dem, was Sie wollen, so dass Sie vielleicht in der Lage sein, nur diesen Code zu ändern zu bekommen, was Sie brauchen.

Diese Tools scheinen, wie sie Ihre Spezifikationen entsprechen. Sie können die Grammatiken anpassen, kompilieren bis zu C, und die Verwendung jeden Operators Sie wollen.

habe ich den Code (im Netz gefunden) aus dem folgenden:

Programmübersetzung Fundamentals“von Peter Calingaert

ich verbesserte es handle Funktionen, die Sie Dinge umzusetzen wie "wenn (a, b, c)" (eine Art, wie, wie Excel Dinge tut).

lässt

Sie können einfach Parser selbst bauen oder verwenden Sie eine beliebte „ Parsergenerator “ (einige von ihnen wurden von anderen Beiträgen aufgeführt). nur entscheiden, ob Ihr Parser genug, um die Verwendung kompliziert sein wird (und lernen) ein externes Tool. in jedem Fall müssen Sie die Grammatik definieren, in der Regel ist es die Gehirnintensive Aufgabe, wenn Sie nicht bereits Erfahrung haben. die formale Art und Weise syntaktische Grammatiken zu definieren, ist BNF oder EBNF

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top