2011-09-23 64 views
0

我知道如何使用堆棧來處理像((1 + 2)* 3')這樣的算術表達式字符串。這個問題有沒有典型的Scheme解決方案?解析方案中的算術表達式

+0

清除我的問題:用戶使用+, - ,*,/,)和(當然不是Lisp風格,而是像1 + 3 *(3 - 2)這樣的日常輸入)輸入算術表達式,我想知道Racketors如何實現這些功能:是否有任何特定的函數或庫文件? –

+0

好吧,我更新了我的答案,以引用球拍中包含的解析器示例。 –

+0

I已經想出了一個將* infix *算術表達式轉換爲*二元表達式樹的算法,這是一個更好的解決方案,我會很快發佈我的算法。 –

回答

1

有點難以分辨出你問的是什麼問題。在方案(或球拍),你幾乎肯定會寫出這樣的評價 「直接」,像這樣:

  • 爲E1 * E2,收益率(EVAL E1)倍(EVAL E2)
  • 爲E1 + E2,return(eval E1)plus(eval E2)

...所以評估者的字面意思是三行。

請注意,在此定義中,不需要明確地跟蹤堆棧(當然,您可以在任何其他語言中執行相同的操作 - 只有在您想寫入時才使用顯式堆棧 評估者以循環的形式,並且不想分開解析步驟)。

要解析表達式,您需要......好吧,您可能需要解析器。如果您使用的是Racket, 您可以參考collects/parser-tools/examples/calck.rkt中Racket附帶的計算器示例。它處理你描述的一切。我可以把它全部粘貼在這裏,但這可能是矯枉過正。

0

是的,Scheme解決方案是解析表達式,然後像您已經知道的那樣使用堆棧。