2013-11-27 5 views
8

Gibt es eine bessere Möglichkeit, unary "-" bei der Umwandlung eines Infix-Ausdruck zu einem Postfix einen zu behandeln?Umgang mit unary minus für Shunting-Yard-Algorithmus

Die offensichtliche wäre Präfix jeder unäre "-" mit einer 0. Weiß jemand bessere Umsetzung? Vielen Dank!

+0

Es gibt mehrere Lösungen für dieses Problem, afaik alle von ihnen sind bis zu einem gewissen Grad hackish. – harold

+0

Zwei Jahre nach deinem Post hatte ich gerade die gleiche Frage. Es ist die Frage, die immer relevant ist. Hier ist eine Beobachtung: Das Hinzufügen einer Null (was ich auch in Betracht gezogen habe) wird nicht immer funktionieren: Beispiel: - 3 würde in 0 konvertiert werden - 3 -3 = -6 Die meisten Parser würden das Minus als ein Mal minus ein Produkt anwenden , was wäre: - (-3) = 6. Cheers, – MrVelez

+0

@MrVelez: Sie haben Recht, dass die Vorsilbe Null funktioniert nicht, aber aus einem anderen Grund. Die Vorverarbeitung von '- 3' durch vorangestellte Nullen sollte '0-0-3' ergeben (nicht '0-3-3', woher kommt die zweite 3?). Ie ', - 3' -> '0 -, - 3' -> '0-0-, 3' -> '0-0-3, was zum Postfix' 0 0 - 3 - führt. ". Dies ergibt -3, was wahrscheinlich nicht das ist, was wir von -3 erwarten. \ Wenn wir '0-0-3' bekommen könnten, um zum Postfix '0 0 3 - -' zu übersetzen, würde es zu der gewünschten 3 auswerten. –

Antwort

6

Wie ich das vor Jahren gemacht habe, erfand ich einen neuen Operator für meinen Postfix-Ausdruck. Wenn ich also im Infix auf ein unäres Minus stößt, würde ich es in # umwandeln. Also mein Postfix für a + -b wurde ab#+.

Und natürlich musste mein Evaluator wissen, dass # nur einen Operanden knallte.

Die Art hängt davon ab, wie Sie den Postfix-Ausdruck verwenden, sobald er erstellt wurde. Wenn Sie es anzeigen möchten, würde Ihr spezieller Operator wahrscheinlich Leute verwirren. Aber wenn Sie es nur intern verwenden (was ich war), dann funktioniert es großartig.

+1

Ich tue das auch. Der einzige Weg, wie ich feststellen kann, dass ich im Infix auf ein unäres Minus gestoßen bin, besteht darin, einen booleschen Kontext beizubehalten, der festlegt, ob als nächstes ein Operator oder ein Operand erwartet wird. Ich würde gerne wissen, was andere getan haben, um zu entscheiden, wann ein Bindestrich unär oder binär ist. –

+0

@ A.I.Breveleri: Wenn Sie einen rekursiven Abstiegsparser für das Infix verwenden, können Sie den unären Operator erkennen, ohne den Zustand explizit zu verwalten. Siehe zum Beispiel http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm. –