Formel Parser

  • Ich glaube auch nicht, dass ein reiner Formelparser eine besondere Herausforderung ist.
    Sehe ich auch so.

    <Übertreibung mode="ein bischen">
    Hat sogar Bill ca. 1975 eigenhändig für einen sehr populären BASIC-Interpreter geschafft (gabs bald auch im Apple ][) und man sagt ja dass er ein besserer Verkäufer wäre als Programmierer (siehe z.B. bernd-leitenberger.de/gates.html)
    </Übertreibung>

    -- hns
  • Warum keinen Parsergenerator? Man steckt 'ne Grammatik der zu erkennenden Sprache rein und kriegt ein wirklich hochoptimiertes Stück C-Code raus. Da wimmelts nur so von GOTOs and statischen Tabellen! Ist 'ne wahre Freude das anzusehen. Widerspricht zwar jedem guten Programmierstil, aber ist natürlich auch nicht für das Auge des Programmierers gedacht sondern für den Compiler! Das Problem ist wirklich seit Urzeiten gelöst und es gibt Tools dies erledigen. Der Prof. hat Recht! Nur wenige Informatiker/Programmierer können damit umgehen, dabei ist es dank der Tools fast geschenkt. Die Zeit die man zur Einarbeitung braucht ist wirklich sehr gut inverstiert, da man doch ständig irgendwas parsen muss! Klar kann man einen recursive descent parser bauen, doch das Ergebnis von Bison ist viel besser! Er arbeitet nach dem bottom-up Prinzip und kann somit einfach kompliziertere Sprachen parsen als ein top-down parser!

    Was der erzeugte Parser tut während er parsed, also einen Baum aufbauen oder gleich ausrechenen, ist nach Belieben vom Programmierer beeinflussbar!

    Mein Tipp: Ran an das Zeug, iss da, geht, und ist geschenkt.

    Es ist sogar noch halbwegs erweiterbar, da man eben nicht tonnenweise C-Code für eine bestimmte Sprache schreibt, sondern die zu erkennende Sprache schön ein einer Datei für die Grammatik ausgelagert hat!
  • Original von ai-freak
    Warum keinen Parsergenerator?


    Hm, wie wäre es mit

    Quellcode

    1. @interface MacOSXBisonWrapperClass
    2. + sharedBison;
    3. - (id) initWithGrammar:(NSString *) str;
    4. - (NSData *) generateTables;
    5. @end
    6. @interface NSData (MacOSXBisonWrapperExtension)
    7. - (BOOL) parseSource:(NSString *) string;
    8. @end

    oder so ähnlich? NSData kann man in ein Ressource-File schreiben oder auch lesen.

    -- hns
  • weis jetzt net für welchen zweck du das brauchst aber falls du es nur auf deinem rechner verwendest dann kannst ja einfach ein c-programm schreiben das das resultat der berechnung zurückgibt. Den programmcode musst du in deienm hauptprogramm erstellen, die rechnung mit einfügen, dann in ein file schreiben, compilieren und ausführen ;)

    math.h net vergessen ;)

    War nur ein vorschlag der in WENIGEN situtaionen ein akzeptabler lösungsweg wäre ;)
  • Habe jetzt einen ersten Stand fertig. Grundrechenarten, Klammern und "Variablen" funktionieren schon hervorragend und für den Rest, also Funktionen, Vergleiche etc. sehe ich im Moment auch keine Probleme bei der Implementierung. Ist doch alles nicht so schwierig wie ich es mir vorgestellt habe, wenn man sich mal ein wenig die verschiedensten Lösungsansätze angeschaut hat.

    Das Programm zerlegt die Formel in ihre Bestandteile und fasst dann die einzelnen Ausdrücke in entsprechende Objekte z.B. für eine Addition, eine Klammer oder eine "Variable" zusammen. Hierbei werden natürlich die entsprechenden Regeln der Grundrechenarten berücksichtigt. Die Formel kann man dann sogar wieder komplett über die Wurzel ausgeben lassen und diese sieht dann wie das Original aus. Also alles bestens bisher. :))

    Jetzt werde ich erst einmal eine weitere Baustelle in meinem Programm aufmachen, bevor ich mich dann wieder an die Implementierung der Auflösung von Funktionen und Vergleichen begebe.
  • Hm, da ich den Parser für ein kommerzielles Programm benötigt, kann ich den Source nicht unter die GPL stellen ohne dass dadurch das komplette Programm unter die GPL fällt. Der Parser ist auch speziell auf das Programm abgestimmt, so dass eine komplette Veröffentlichung der Sourcen in meinen Augen nicht viel Sinn machen würde.

    Sobald es eine vorzeigbare Version des Programms gibt, werde ich sicherlich auch eine Demo-Version zur Verfügung stellen können um den Parser in Funktion zu sehen und testen zu können. ;)
  • Nein, der Algorithmus ist der gleiche. Ob ich nun gleich die entspechende Operation ausführe, oder einen Knoten anlege, ist genau eine austauschbare Zeile in 127312739 Zeilen. Ebensogut könnte ich auch das ganze auf die Konsole loggen. Ändert auch nichts am Algotrithmus.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?