TR (Parsing - one step further)



  • Folgendes: Ich schreibe gerade einen etwas besseren Taschenrechner. Hierzu stellt sich mir die Frage: wie regle ich Zuweisungen richtig?
    a[0]=7 soll genauso gehen wie z=4 und (ja, lambda *g* - nich lambada) square=lambda(x)x*x...
    ebenso möchte ich sagen können: (a,b)=(b,a). Hierzu hab ich mir mehrere Möglichkeiten überlegt:

    • einen Parse-Tree erstellen und den dann von oben wieder aufrollen
    • für die linke Seite eine eigene Grammatik erstellen
    • bezeichner wie a oder b geben nicht zurück (in der grammatik, recursiv) den wert sondern eine referenz auf diesen

    problematisch sind bei punkt 1 und 2 der aufwand, bei punkt 3 wird (a,b)=(b,a) kompliziert...
    punkt 2 find ich eher weniger ellegant und möchte diese möglichkeit am ehesten verwerfen
    was würdet ihr machen?



  • ich nehm jetz hauptsächlich methode 1, falls notwendig mit etwas pfeffer 3



  • Du könntst es mit einer Stack-Maschine machen.

    Ein Simples Z=4 wäre dann
    push 4
    assign (z) // popt element vom Stack

    (a,b) = (b,a)
    push b
    push a
    assign(b)
    assign(a)

    Das könnte man für beliebig komplexe Formeln verwenden:
    a=z*(x+y)
    push(x)
    push(y)
    add // popt zwei Werte vom Stack, addiert sie und pusht das Ergebnis wieder
    push z
    mult // wie add
    assign (a)

    Je nachdem, wie du deine Variablen verwaltest musst du beim assign dann statt dem Namen die Adresse übergeben.



  • @frenki: die idee ist vor allem in kombination mit meinem so geliebten lambda recht praktisch. das werden aber eindeutig mehr als die bislang existierenden 700 zeilen code. *g*

    ps: stellt sich nur noch die frage, ob ich die funktion wirklich "CreateDaFuckinImmCode" nennen sollte 😉


Anmelden zum Antworten