004
19.12.2007, 19:21 Uhr
0xdeadbeef
Gott (Operator)
|
Naja, ein recursive descent parser wäre hier wohl ziemlicher Overkill, da sollte auch ein einfacher Kellerautomat reichen. Dafür ist die Postfix-Notation ja schließlich da.
Wenn x jetzt beim Parsen schon bekannt wäre - also der Ausdruck zu interpretieren wäre - wärs ja nach dem Auseinanderpfriemeln denkbar einfach. Für den Ausdruck
n3xn2/f sqrt *xxf sin *n2/+;
Sähe das etwa so aus:
Lege 3 auf den Stack, Rest xn2/f sqrt *xxf sin *n2/+; Lege x auf den Stack, Rest n2/f sqrt *xxf sin *n2/+; Lege 2 auf den Stack, Rest /f sqrt *xxf sin *n2/+; Nimm zwei Elemente vom Stack, dividiere, lege das Ergebnis zurück. Rest f sqrt *xxf sin *n2/+; Nimm ein Element vom Stack, rechne sqrt aus, lege das Ergebnis zurück, Rest *xxf sin *n2/+; Nimm zwei Elemente vom Stack, multipliziere, lege das Ergebnis zurück, Rest xxf sin *n2/+; Lege x auf den Stack, Rest xf sin *n2/+; Lege x auf den Stack, Rest f sin *n2/+; Nimm ein Element von Stack, rechne sin aus, lege das Ergebnis zurück, Rest *n2/+; Nimm zwei Elemente vom Stack, multipliziere, lege das Ergebnis zurück, Rest n2/+; Lege 2 auf den Stack, Rest /+; Nimm zwei Elemente vom Stack, dividiere, lege das Ergebnis zurück, Rest +; Nimm zwei Elemente vom Stack, addiere, lege das Ergebnis zurück, Rest ; Prüfe, ob der Stack ein Element groß ist, wenn nicht, Fehler, wenn ja, nimm das Ergebnis vom Stack.
Aus diesem Prozess willst du jetzt, anstatt das auszurechnen, aber einen abstrakten Syntaxbaum zusammensetzen, also dir die Struktur merken. Was du am Ende haben willst, sieht etwa so aus:
Code: |
+ .--------------. * / .------. .------. 3 sqrt * 2 | .---. / sin x .-----. | x 2 x
|
Für deinen Prozess bedeutet das im Grunde, dass du dir einen Stack von Baumknoten halten musst, und anstatt die Operation, wie oben, gleich durchzuführen, du die entsprechende Anzahl Baumknoten vom Stack nimmst, einen Baumknoten mit dem Kennzeichen der entsprechenden Operation erstellst, ihm die beiden anderen Baumknoten als Kinder zuweist, und den fertigen Baumknoten wieder auf den Stack legst. Am Ende liegt dann dein Wurzelknoten auf dem Stack. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 19.12.2007 um 19:23 Uhr von 0xdeadbeef editiert. |