Formel Parser

  • Ich versuche nicht meine Syntax in einen Baum zu quetschen, sondern baue einen Baum aus der Syntax

    5 * 3 + 2

    Erzeugt nach _obigen Algorithmu_s

    Quellcode

    1. +
    2. parse(5*3) parse(2)


    erzeugt

    Quellcode

    1. +
    2. * 2
    3. parse(5) parse(3)


    erzeugt

    Quellcode

    1. +
    2. * 2
    3. 5 3


    Nochmal: _Das erzeugt_ der obige Alogrithmus!
    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"?
  • *seufz* Max, du bist wirklich manchmal schwierig.

    Du hast gesagt, dass der Algo falsch sei, weil man einen Baum erzeuge.
    Darauf habe ich erwidert, dass er einen Baum erzeuge.
    Darauuf hast du gesagt, dies sei ein anderer Algorithmus.
    Darauf habe ich dir versucht klarzumachen, DASS DIESER ALGORITHMUS SEHR WOHL DEN VON DIR VERLANGTEN BAUM ERZEUGT!

    Das ist eigentlich nicht schwer zu verstehen.
    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"?
  • Jungs, ihr bringt mich noch ganz durcheinander. ?(

    Bin mir jetzt schon nicht mehr sicher, ob der bereits gefundene Alogrithmus wirklich alle Fälle abdecken kann oder nicht. Zudem muss ich den Alogrithmus noch so erweitern, dass auch bool'sche Ausdrücke verarbeiten können. Leider finde ich aktuell nicht genug Zeit mir die Sache mal genauer anzuschauen, zu erweitern und zu testen. X(

    Na ja, ab Samstag steht ja mal wieder ein verlängertes Wochenende vor Tür und da werde ich hoffentlich die Zeit finden, mir den ganzen Kram mal in Ruhe anzuschauen.
  • Abgesehen davon, dass ich die Antowrt etwas zu feinsinnig fand, meine ich fast, dass ich mich nicht auf destruktive Ratschläge beschränke. Es gibt jedenfalls den einen oder anderen, der etwas positives aus meinen Beiträgen und Artikeln lernt.

    Bei anderen bezweifele ich das.
    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"?
  • Tom du bist Klasse, deine Beiträge haben auch fast immer etwas und deine Beharrlichkeit sind hier legdär. Aber machmal auch etwas herablassend. Es gibt auch andere die sich mit Speicherverwaltung auskennen :)

    Was auch bestimmt mit deinem Artikel zu tun hat, denn der ist gut und gibt einem mal ein etwas andere Ansicht.

    Obwohl ich Persölich eher solche Setter-Methoden bevorzuge.

    Quellcode

    1. - (void) setColor:(NSColor*)newColor;
    2. {
    3. if (color != newColor){
    4. [color release];
    5. color = [newColor retain];
    6. }
    7. }


    Aber jeder hat ja seinen Stil :)
  • Tom du bist Klasse, deine Beiträge haben auch fast immer etwas und deine Beharrlichkeit sind hier legdär. Aber machmal auch etwas herablassend. Es gibt auch andere die sich mit Speicherverwaltung auskennen


    Ja, an dem einen Tag, war ich etwas mies drauf. Aber wenn du die Diskussion mit Michael meinst, so glaube ich nicht, dass ich herablassend war, zumal ich Michael schätze.

    In der Tat bin ich beharrlich, weil ich dann doch genau wissen will, wie es geht, was gemeint ist usw. Das mag manchmal herablassend klingen, ist aber nicht so gemeint. Ich will es bloß genau wissen, damit ich es auch verstehen kann. Und das wunderschäne deutsche Wort ver_stehen_ zeigt uns, dass Beharrlichkeit dabei wichtig ist. ;)

    Deine Setter-Methode ist ja auch in dem verlinkten Artikel besprochen. Ich meine sie ist letztlich anders als der Copy-Setter inhaltlich das gleicxhe: Es wird eine Referenz gesetzt.

    Das Problem des Widersetzen des schon Gesetzetn, ach, einfach ein Beispiel:

    Quellcode

    1. [self setWas:[self was]];


    wird bei dem if-Setter anders gelöst. Ich finde den auch sehr elegant, beinahe eleganter, allerdings nicht ganz so anschaulich. Aber ich werde ohenhin am LANGEN WOCHENENDE JUHUUUUUUUUUU und ich muss nicht einmal Samstags unterrichten JUHUUUUU (Das war jetzt ein kleiner Gefühlsausbruch) daran auch noch arbeiten, andere Setter vorstellen und auch den anderen Getter hereinbringen. Ansonsten ist doch jeder eingeladen, selbst an dem Artikel herumzuschreiben. Allerdings sollte man bei tiefergehenden Eingriffen die Diskussionsseite benutzen.
    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"?
  • Habe noch eine Idee, um sich den Parser zu sparen: Entweder du benutzt NSAppleScript und holst dir das Ergebniss über NSAppleScriptDescriptor (oder so), oder du benutzt NSTask mit folgendem aufruf: osascript -e "get 5+3+2-6" (statt 5+3+2-6 dann dein eigenes Zeug).
    Beider ist allerdings nicht Threadsafe, dafür das Einfachste, was du machen kannst...
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • Original von Tom9811
    *seufz*

    Wenn es dasselbe ist, welchen Teil hat dann der Dozent kritisiert?

    Sorry, Max, es hat wohl keinen Sinn.

    WEIL WEDER DU NOCH ICH AUCH NUR EINEN BLASSEN SCHIMMER VON SYNTAXANALYSE UND FORTGESCHRITTENEN DATENSTRUKTUREN FÜR DIESE AUFGABE BESITZEN!!!!!! oder hats du dich Jahre damit beschäftigt? Es ist ne nette Idee und sie funktionier auch nett, aber sie ist weder schnell, noch flexibel genug.

    Ich kann dir nicht sagen, WAS man besser machen soll, aber ich kann dir sagen, dass sich der Typ einen Lebtag damit beschäftig und den Quatsch auch noch unterrichtet. Er hat gesagt, dass selbst unter Diplom-Informatikern nur wenige das Können haben, einen guten Formelparser zu schrieben. Und wenn er das sagt, glaub ich das ihm auch.

    Es ist schön, dass du deine Prinzipien hast und es ist auch schön, dass du genau wissen willst, wie es funktioniert, aber es gibt auch mal ne Grenze, wo du dich selber auf die Suche begeben musst, wenn dus noch genauer willst. Es gibt Leute, die sich echt lange mit so'nem Kram beschäftigen (oder auch nem Counter), da kannst du nicht einfach ankommen und das Gegenteil behaupten. Und selbst wenn du andere Meinung bist, musst du das nicht so offen vor dir hertragen.

    Max
  • Original von Squart
    Habe noch eine Idee, um sich den Parser zu sparen: Entweder du benutzt NSAppleScript und holst dir das Ergebniss über NSAppleScriptDescriptor (oder so), oder du benutzt NSTask mit folgendem aufruf: osascript -e "get 5+3+2-6" (statt 5+3+2-6 dann dein eigenes Zeug).
    Beider ist allerdings nicht Threadsafe, dafür das Einfachste, was du machen kannst...

    Sowas ist natürlich sehr praktisch und auch zu empfehlen. Lasst die anderen doch die Arbeit machen ;)
  • Original von Tom9811
    Dein Prof hat aber sicher erkannt, dass es für den Algo ganz gleich ist, ob man einen Baum anlegt oder die (Teil-)ergebnisse gleich einsetzt, nicht wahr?

    Ist m.E. nur dann gleichwertig wenn man die Formel gleich ausrechnen will.

    Wenn man aber erst einen Assemblercode erzeugen will, der es dann später ausrechnet muss man erst mal den Baum erstellen. Und dann den Baum optimieren (gcc -O). Und dann für jeden Knoten Assemblercode in eine Zwischendatei schreiben usw.

    Da es beim Parsen an Unis meist um Compilerbau geht, bezieht sich die Prof-Antwort vermutlichst darauf und nicht auf das "bloße" ausrechnen.
  • Ui, das ist ja mal wieder ein lustiger Thread. Lustig deshalb, weil Ihr Euch m.E. um eine Nebensache streitet. Die Aufgabe besteht doch darin, 1. eine serielle Repräsentation nach syntaktischen Regeln in eine Baumstruktur umzuwandeln und 2. diese Baumstruktur nach semantischen Regeln auszuwerten. Offensichtlich müssen beide Teilaufgaben durch den Baum durch. Und das kann man a) in einem Durchgang oder b) nacheinander in zwei Durchgängen machen. Natürlich ergeben sich dadurch Unterschiede, so spart man sich z.B. bei a) einen Baumdurchlauf und die explizite Repräsentation des Baumes, andererseits kann man bei b) die Baumstruktur wiederverwenden (um z.B. eine Formel mit mehreren Belegungen auszuwerten oder neuen Code daraus generieren) und syntaktische Fehler (z.B. eine fehlende Klammer) vor semantischen Fehlern (z.B. eine Division durch 0) erkennen. Aber das ist doch eine Kleinigkeit zu den Teilaufgaben selbst, oder?

    Etwas konstruktiver: Ich habe eine Implementation eines solchen Parsers angehängt, den ich irgendwo noch rumliegen hatte. Der ist sehr umständlich und nicht schön geschrieben, ich weiß - ist ein schneller Hack und eben quick'n dirty umgebastelt und in ein Miniprojekt reingeklopft. Aber vielleicht hilft's ja etwas weiter. Hat jemand Lust, das Ding entweder schöner und besser zu machen oder etwas Neues in der Richtung zu basteln? Sowas kann man ja immer wieder mal gebrauchen...
    Multigrad - 360°-Produktfotografie für den Mac
  • Hallo ihr, wenn der Parser erweiterbar sein soll, ist ein Parsergenerator echt zu empfehlen. Die GNU Version von Yacc heist Bison und ist schon auf eurer Platte.

    Die Docu zu Bison ist ziemlich gut und hat als Beispiel ... ja ihr glaubt's nicht einen Formelparser (der das Ergebnis gleich mitausrechnet)

    Schaut mal unter:

    gnu.org/software/bison/manual/…o/bison.html#Infix%20Calc

    Der Nachteil ist, dass der Bison natürlich C und nicht Objective-C erzeugt ...
  • WEIL WEDER DU NOCH ICH AUCH NUR EINEN BLASSEN SCHIMMER VON SYNTAXANALYSE UND FORTGESCHRITTENEN DATENSTRUKTUREN FÜR DIESE AUFGABE BESITZEN!!!!!! oder hats du dich Jahre damit beschäftigt? Es ist ne nette Idee und sie funktionier auch nett, aber sie ist weder schnell, noch flexibel genug.


    Das glaueb ich nicht, Tim.

    BTW: Der Graph für eine mathematische Formelanalyse ist nicht sonderlich schwierig. In die Knoten setzt du die Operatoren, in die Blätter die Werte.

    Ich glaube auch nicht, dass ein reiner Formelparser eine besondere Herausforderung ist.
    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"?