當前位置:首頁 » 編程軟體 » 編譯回填是什麼意思

編譯回填是什麼意思

發布時間: 2023-07-28 00:41:11

編譯器筆記34-中間代碼生成-布爾表達式的回填

基本思想:生成一個跳轉指令時,暫時不指定該跳轉指令的目標標號。這樣的指令都被放入由跳轉指令組成的列表中。同一個列表中的所有跳轉指令具有相同的目標標號。等到能夠確定正確的目標標號時,才去填充這些指令的目標標號。

B.truelist:指向一個包含跳轉指令的列表,這些指令最終獲得的目標標號就是當B為真時控制流應該轉向的指令的標號。

B.falselist:指向一個包含跳轉指令的列表,這些指令最終獲得的目標標號就是當B為假時控制流應該轉向的指令的標號。

為了處理跳轉指令的列表我們構造了三個函數

上述的布爾表達式將被翻譯成兩條跳轉指令。兩條跳轉指令的標號都不填寫因為這兩條跳轉指令的標號都在等待回填,因此我們要把它放到相應的列表中。

第一條跳轉指令的目標標號是B的真出口,因此我們把它放到B.truelist中。調用makelist函數生成一個只包含nextquad的列表,並把這個列表的指針賦值給truelist,這里的nextquad是指即將生成的下一條指令的標號,即gen('if' E1.addr relop E2.addr'goto_')這條指令的標號。

第二條跳轉指令的目標標號是B的假出口,因此把這條跳轉指令存放到B.falselist中。因此我們調用makelist函數生成一個只包含nextquad+1這樣一個標號的列表,nextquad+1標號就是gen('goto_')這條指令的標號。

這樣的話我們就將這兩條指令分別放入到B.truelist和B.falselist中。

問:list中存的是對應跳轉指令的標號?

當B定義為true時,此時可以確定布爾表達式的值為真,生成一條跳轉到B的真出口的一條指令。由於此真出口的標號不能確定有待回填,我們把它放入到B.truelist中。

當B定義為false時,此時可以確定布爾表達式的值為假,生成一條跳轉到B的假出口的一條指令。由於此真出口的標號不能確定有待回填,我們把它放入到B.falselist中。

對B的翻譯與其對應的子表達式B1的翻譯是相同的,因此B的屬性值等於B1的屬性值。

B的值與B1的值正好相反,因此將兩個非終結符的屬性進行對調。

B1.truelist中的這些指令都要跳轉到B1的真出口,當B1為真的時候整個表達式的值就是為真的,因此B1的真出口就是B的真出口。要跳轉到B1的真出口就是跳轉到B的真出口,因此B1.truelist中的指令都要放到B.truelist中。

B2.truelist的指令都要跳轉到真出口,當B2為真時整個表達式的值也為真,因此B2的真出口就是B的真出口。要跳轉到B2的真出口就是要跳轉到B的真出口,因此B2.truelist中的指令都要放到B.truelist中。

B1.falselist中的指令它們都是要跳轉到B1的假出口,當B1的值為假的時候我們要進一步判斷B2的值,因此B1的假出口就是B2的第一條指令,因此B1.falselist中的指令都要跳轉到B2的第一條指令。

B2.falselist中的指令都要跳轉到B2的假出口,當B2的值為假的時候那麼整個布爾表達式的值也是假的。因此B2的假出口就是B的假出口,要跳轉到B2的假出口也就是要跳轉到B的假出口。B2.falselist中的指令都要放置到B.falselist中。

根據此示意圖可以看出,在分析B2之前,要用B2的第一條指令的標號來回填B1.falselist中的各條指令。當然我們可以記錄下B2的第一條指令的標號在歸約時完成此回填動作。為了記下B2第一條指令的標號我們在非終結符B2之前插入一個標記非終結符M。與M關聯的語義動作它的任務就是記錄下B2的第一條語義動作的標號。我們給M設置一個綜合屬性quad,M.quad等於下一條指令的標號。因為我們把M放在B2之前,因此M.quad記錄的是第二條指令的標號。根據翻譯方案示意圖,我們要用M.quad來回填B1.falselist中的各條指令,因此調用backpatch用M.quad回填B1.falselist中的各條屬性。B.truelist是由B1.truelist和B2.truelist合並而成的,因此我們調用merge函數將B1.truelist和B2.truelist進行合並,將合並後的指針賦值給B.truelist。

註:因為這里我們定義的都是綜合屬性,從左向右掃描輸入串。makelist函數生成一個只包含下一條指令的列表,並把指針賦值給B.trulist。我們假設下一條指令從100開始。gen(『if 』 E 1 .addr relop E 2 .addr 『goto _』)中E1.address等於a,relop就是小於號,E2.address等於b,引號中的字元串按字面值傳遞。下劃線表示待回填的目標標號。

註:將棧頂中的空串歸約成一個標記非終結符M

註:有四條指令是等待回填的,在B的truelist中有兩條指令100和104,當B的真出口確定以後我們將用B的真出口的標號這兩條指令。同理當B的假出口確定以後將會用B的假出口的標號回填此兩條指令。

熱點內容
c語言取隨機數 發布:2025-02-06 02:46:57 瀏覽:863
uc緩存的視頻卡住 發布:2025-02-06 02:17:05 瀏覽:144
解壓同學介紹 發布:2025-02-06 02:13:10 瀏覽:776
icsftp 發布:2025-02-06 02:12:59 瀏覽:325
ftp跨域上傳文件 發布:2025-02-06 02:09:22 瀏覽:822
非遞歸全排列演算法 發布:2025-02-06 02:06:45 瀏覽:551
vs反編譯dll 發布:2025-02-06 02:06:00 瀏覽:584
ubuntu設置ftp許可權 發布:2025-02-06 01:54:07 瀏覽:599
奇瑞5哪個配置值得買 發布:2025-02-06 01:51:56 瀏覽:552
黑鯊手機哪裡看安卓版本 發布:2025-02-06 01:36:04 瀏覽:803