什麼是反向補丁 (Backpatching)?
在為給定表示式生成三地址碼時,它可以指定 goto 語句中標籤的地址。在一遍掃描中很難分配這些標籤語句的位置,因此使用兩遍掃描。在第一遍掃描中,它可以不指定這些地址;在第二遍掃描中,它可以填充這些地址。因此,對不完整轉換的填充稱為反向補丁 (Backpatching)。
使用反向補丁的一遍程式碼生成
反向補丁可用於為布林表示式和控制流語句生成一遍程式。在此,非終結符 B 的綜合屬性 truelist 和 falselist 用於處理布林表示式的跳轉程式碼中的標籤。
具體來說,B.truelist 將是一個跳轉或條件跳轉指令列表,如果 B 為真,則應在其中新增控制跳轉到的標籤。B.falselist 同樣是最終獲得控制跳轉到標籤的指令列表,此時 B 為假。
當為 B 生成程式時,對真假存在的跳轉將保持不完整,標籤欄位未填充。這些初步跳轉位於 B.truelist 和 B.falselist 指向的列表上(視情況而定)。
同樣,語句 S 具有綜合屬性 S.nextlist,指示跳轉到 S 程式碼之後指令的列表。它可以將指令生成到指令陣列中,標籤將是此陣列中的索引。為了操作跳轉列表,我們使用三個函式:
**Makelist (i)** - 建立一個新列表,其中僅包含 i,它是指令陣列中的一個索引;makelist 返回指向新生成的列表的指標。
**Merge(p1,p2)** - 連線 p1 和 p2 指向的列表,並返回指向連線列表的指標。
**Backpatch (p, i)** - 將 i 插入到 p 指向的記錄上的每個指令的目標標籤中。
布林表示式的反向補丁
它可以建立一個適合在自下而上分析期間為布林表示式生成程式碼的翻譯方案。語法中的非終結符標記 M 生成一個語義操作,以便在適當的時間獲取要建立的下一條指令的索引。語法如下:
B → B1| | MB2|B1&& MB2|! B1|(B1)|E1rel E2|True|False
M → ϵ
控制流語句
控制語句是改變語句執行流程的語句。例如,If、If-else、Switch-Case、while-do 語句。在程式語言中,布林表示式通常用於
**改變控制流** - 布林表示式用作改變控制流的語句中的條件表示式。此類布林表示式的值隱含在程式中達到的位置。例如,if (E) S,如果到達語句 S,則表示式 E 必須為真。
**計算邏輯值** - 布林表示式可以描述真或假值。可以使用帶有邏輯運算子的三地址指令平行計算此類布林表示式,就像算術表示式一樣。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP