2012-12-10 111 views
2

我正在編寫簡單(類C語言)編譯器的代碼生成部分。我對「if」語句有問題。我想爲條件的每個部分生成相應的跳轉指令,就像GCC所做的那樣。保存布爾表達式結構的結構是一個抽象語法樹。if語句的代碼生成

到目前爲止,我寫了一個函數,它可以生成相應的標籤以進行比較以及邏輯和邏輯否定。然而,當試圖使這個函數適合邏輯或者工作時,我遇到了一個很大的問題。

對於簡單的語句,如

if (25 < 19) then 
    print 99 
statements 

,我想我的代碼看起來像這樣:

cmp 25, 19 
jge label0 
label1: 
print 99 
label0: 
statements 

(和我的功能確實爲這個簡單的例子類似的顯示內容)。

當處理否定時,您只需要否定這些條件的測試(將jge轉換爲上面的jl)。對於邏輯和,您只需以直接方式順序生成左右連接符的相應代碼。但是對於OR來說,我遇到了一些具有挑戰性的問題。如果條件失敗,而不是跳轉到if(或next else分支)之後的語句,則對於所有其他情況,如果OR操作數中的任何一個操作數保持不變,則必須跳轉到代碼所在的實際位置。然後當你有兩個OR時,情況就會變得更糟,因爲AST表示使用二進制節點的OR,而那些試圖將翻譯爲我們的中間代表選擇的函數使用這個AST。

任何人都可以提供他們對這個問題的幫助嗎?我也嘗試過諮詢'編譯器編譯器',但是我沒有設法從那裏找到任何有用的東西。

回答

1

我記得當我在學校時做類似的事情。

您應該關注讓您的編譯器針對這些表達式中的每個條件生成結果,然後使用CPU提供的「和」或「或」指令「合併」結果,然後根據「合併」結果。

+0

爲什麼這個答案應該得到一個downvote? –

+0

我不知道是誰低估了你的評論。我意識到這種技術,但我想直接嘗試生成跳轉。 – user1890481