我正在編寫簡單(類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。
任何人都可以提供他們對這個問題的幫助嗎?我也嘗試過諮詢'編譯器編譯器',但是我沒有設法從那裏找到任何有用的東西。
爲什麼這個答案應該得到一個downvote? –
我不知道是誰低估了你的評論。我意識到這種技術,但我想直接嘗試生成跳轉。 – user1890481