2013-10-17 85 views
0

我知道我們如何在轉換爲波蘭語符號後評估表達式。不過,我想知道我怎麼能這樣評價了一句:布爾表達式中的評估函數和表達式

If a < b Then a + b Else a - b 

a + b發生的情況下,狀態a < b是真,否則,如果假a - b計算。

語法在這裏不是問題。因爲我只需要算法來解決這個問題。我能夠評估布爾和代數表達式。但是我怎麼能解決上述問題呢?

+0

如果你只是需要算法,你可能會丟掉語言標籤。你需要哪方面的幫助?解析,如何在堆棧中表示切換語句等? – Kindread

+0

我在Tokenizing的代數表達式中遇到問題。 –

回答

0

你需要給某物分配一個+ b或a-b嗎?

你可以這樣做:

或者

int sign = a < b ? 1 : -1; int c = a + (sign * b);

+0

認爲你的意思不夠。 – Kindread

+0

但我如何評估這在運行時?這是編譯時間代碼。我們在這裏討論運行時表達式評估'不'編譯時間。我不認爲你在這裏理解這個問題。 –

+0

Thanks @Kindread,我更正了我的代碼。 –

0

請參考S-快遞LISP語言: e.g

(if (> a b)     ; if-part 
    (+ a b)     ; then-part 
    (- a b))     ; else-part 
0

其實,如果你はnt只評估這個簡單的if語句,對它進行評估並對​​其進行評估,但是如果你想評估某些更復雜的事情,比如嵌套if else,如果使用experssions,多個else,變量賦值,類型等等,則需要使用一些解析器,如LR parsers。您可以使用例如Lex&Yacc爲您自己的語言編寫出色的解析器。他們支持某種複雜的語法。但是如果你想知道LR解析器(或者如此)是如何工作的,你應該閱讀它們,看看它們如何使用它們的表來讀取令牌並解析它們。例如看一下wiki頁面,看看LR分析器表是如何工作的(這不僅僅是簡單的堆棧,而且在這裏不容易描述)。

如果您的問題真的很解析if語句,可以從分析器技術作弊,你可以else後經過< B,這意味着一些行動,而空的東西加空的東西,這也意味着一個動作。當你解析條件時,根據正確性或錯誤,你將運行一個動作。順便說一句,如果你想解析表達式裏面的語句,你需要條件堆棧,意味着像SLR table

0

基本上,你需要建立一個三元運算符的支持。 IE,在那裏你彈出一個運算符,然後等待2個連續的值,然後再解析它,如果你當前的操作是IF,那麼你需要等3,其他操作2。

要處理if語句,可以考慮if語句的C++三元運算符。您希望您的語法支持哪種格式取決於您。

a < b ? a + b : a - b 

你應該能夠在棧上評估布爾運算符您目前評估的算術運算的方式,所以<乙方應推爲

< a b 

的,如果能夠通過自己的符號來表示在堆棧上,我們可以堅持'?'。

? < a b 

和2個的條件,從而評估需要由另一運營商分開,還不如用「:」

? < a b : + a b - a b 

所以,現在當你彈出,你看它是經營者?需要3個值,所以按照通常的方式放在一邊,並繼續評估堆棧,直到有3個值。 ':'運算符應該是一個二元運算符,它將它的兩個值簡單地推回棧中。

一旦你在堆棧上有3個值,你評估?如:

  • 如果第一個值是1,則推第二個值,丟棄第三個值。

  • 如果第一個值爲0,則丟棄第二個並推入第三個。