(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: Wie am besten Parsen?
27. Nov 2005, 09:18
Die Klammern musst Du gesondert betrachten. Bei '(' wird auf den Stack gepackt und bei einem ')' der Stack bis zum '(' aufgelöst. Rekursiv muss da Nichts sein. Das ist ja grad das Lustige an der Methode. Ich vermute mal, Du wirst den Operatoren Werte zuweisen. Stärker ist der, dessen Wert größer ist. Sollte das nicht mit den Klammern genauso gehen? Eine '(' stoppt das Auflösen des Stacks für alle Operatoren, mit Ausnahme des ')'. Das ')' löst den Stack bis zum '(' auf und entfernt ds '(' dann.
Beispiel:
2/(3*4+5)
2 push / push ( push 3 push * 4 push + ...ausrechnen 3*4-> 12 push. der Operator auf dem Stack ist das '('=STOP, nicht mehr weitermachen
auf dem Stack ist jetzt 2 / ( 12+, also weitermachen.
5 push )...Auflösen bis zum (', also 12+5=17 : Stack = 2/(17. Top-Operator ist jetzt '(', wir haben ein ')', also weg damit. Stack = 2/17.
Nächstes Token zu Pushen: <End of Input>... Also 2/17 ausrechnen und fertig.
Die Reduzieren des Stacks geht immer nur soweit, bis der oberste Operator ein '(' ist. Der Einzige, der ein '(' eliminieren kann, ist ein ')'.
Der Stack enthält also zu jedem Zeitpunkt nur die Teile des bisher abgearbeiteten Ausdruckes, der infolge der Punkt-Vor-Strich- und der Klammer-Regeln noch nicht ausgerechnet werden konnten. Er wird jeweils zum frühest möglichen Zeitpunkt reduziert, d.h. die obersten Elemente ausgerechnet (und damit der Stack ja verkleinert). Damit werden auch Klammerebenen automatisch richtig behandelt, denn ein ')' bewirkt nur, das Alles, was 'rechts' von dem letzten '(' steht, reduziert, d.h. ausgerechnet, wird.
Mich würde der Code interessieren, wenn es läuft.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
|