2013-11-27 30 views
8

有沒有更好的方法來處理一元「 - 」在將中綴表達式轉換爲後綴?處理一元減號分流碼算法

顯而易見的是每個一元前綴「 - 」和一個0.有沒有人知道更好的實現?謝謝!

+0

對這個問題有幾種解決方案,afaik所有這些都是一些擴展hackish。 – harold

+0

你的文章發佈兩年後,我剛剛有同樣的問題。這是永遠相關的問題。下面是一個觀察結果:添加一個零(我也考慮過)不會總是有效:例如: --3將被轉換爲0 - 3 -3 = -6大多數解析器會將減號作爲時間減去一個乘積,這將是: - (-3)= 6.乾杯, – MrVelez

+0

@MrVelez:你說的是一個零的前綴不正確,但出於不同的原因。預處理' - 3'前綴零應產生'0-0-3'(不是'0-3-3',第二個3來自哪裏?)。即'3' - >'0 - , - 3' - >'0-0-,3' - >'0-0-3',這導致後綴'0 0 - 3 - 」。這個評估爲-3,這可能不是我們想要的--3。 \如果我們可以將'0-0-3'轉換爲後綴'0 0 3 - - ',那麼它將評估爲期望的3. –

回答

6

我在這幾年前的做法是爲我的postfix表達式創建一個新的操作符。所以當我在中綴中遇到一個一元減號時,我會將它轉換爲#。所以我的後綴a + -b成爲ab#+

而且,當然,我的評估者必須知道#只能彈出一個操作數。

類型取決於您在構建後如何使用後綴表達式。如果你想顯示它,那麼你的特殊#運營商可能會混淆人。但如果你只是在內部使用它(我是),那麼它就很好。

+1

我也這樣做。我可以確定我「在中綴中遇到一元減號」的唯一方法是維護一個布爾上下文,該上下文定義接下來是否需要運算符或操作數。我想知道其他人做了什麼來決定連字符是一元還是二元。 –

+0

@ A.I.Breveleri:如果對中綴使用遞歸下降解析器,則可以在不明確維護狀態的情況下識別一元運算符。例如,參見http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm。 –