編譯器設計中控制語句的翻譯是什麼?
控制語句是可以改變語句執行流程的語句。
考慮語法
S → if E then S1
|if E then S1 else S2
|while E do S1
在這個語法中,E 是布林表示式,根據它將執行 S1 或 S2。
以下表示顯示了 if-then、ifthen-else 和 while do 指令的執行順序。
- 𝐒 → 𝐢𝐟 𝐄 𝐭𝐡𝐞𝐧 𝐒𝟏

E.CODE 和 S.CODE 是生成三地址程式碼的一系列語句。
E.TRUE 是如果 E 為真則控制流到的標籤。
E.FALSE 是如果 E 為假則控制流到的標籤。
E 的程式碼如果 E 為真則生成跳轉到 E.TRUE,如果 E 為假則生成跳轉到 S.NEXT。
∴ 在下表中,E.FALSE=S.NEXT。
在下表中,為 E.TRUE 分配了一個新標籤。
當執行 S1.CODE 時,控制將跳轉到 S 之後的語句,即跳轉到 S1.NEXT。
∴ S1. NEXT = S. NEXT。
"If E then S1" 的語法制導翻譯。
| 產生式 | 語義規則 |
|---|---|
| 𝐒 → 𝐢𝐟 𝐄 𝐭𝐡𝐞𝐧 𝐒𝟏 | E. TRUE = newlabel; E. FALSE = S. NEXT; S1. NEXT = S. NEXT; S. CODE = E. CODE | | GEN (E. TRUE '− ') | | S1. CODE |
- 𝐒 → 𝐈𝐟 𝐄 𝐭𝐡𝐞𝐧 𝐒𝟏 𝐞𝐥𝐬𝐞 𝐒𝟐

如果 E 為真,控制將轉到 E.TRUE,即執行 S1.CODE,然後 S.NEXT 出現在 S1.CODE 之後。
如果 E.CODE 為假,則將執行 S2.CODE。
最初,E.TRUE 和 E.FALSE 都被視為新標籤。當在標籤 E.TRUE 上執行 S1.CODE 時,控制將跳轉到 S.NEXT。
因此,在 S1 之後,控制將跳轉到完整語句 S 的下一條語句。
S1.NEXT=S.NEXT
類似地,在 S2.CODE 之後,將執行 S 的下一條語句。
∴ S2.NEXT=S.NEXT
"If E then S1 else S2" 的語法制導翻譯。
| 產生式 | 語義規則 |
|---|---|
| 𝐒 → 𝐢𝐟 𝐄 𝐭𝐡𝐞𝐧 𝐒𝟏 𝐞𝐥𝐬𝐞 𝐒𝟐 | E. TRUE = newlabel; E. FALSE = newlabel; S1. NEXT = S. NEXT; S2. NEXT = S. NEXT; S. CODE = E. CODE | | GEN (E. TRUE '− ') | | S1. CODE GEN(goto S. NEXT) | | GEN (E. FALSE −) | | S2. CODE |
- 𝐒 → 𝐰𝐡𝐢𝐥𝐞 𝐄 𝐝𝐨 𝐒𝟏
另一個重要的控制語句是 while E do S1,即語句 S1 將一直執行,直到表示式 E 為真。當表示式 E 變為假時,控制將退出迴圈。

建立一個指向 E 的第一個指令的標籤 S. BEGIN。標籤 E.TRUE 附加到 S1 的第一個指令。如果 E 為真,控制將跳轉到標籤 E.TRUE 並執行 S1.CODE。如果 E 為假,控制將跳轉到 E.FALSE。在 S1.CODE 之後,控制將再次跳轉到 S. BEGIN,這將再次檢查 E.CODE 是否為真或假。
∴ S1. NEXT = S. BEGIN
如果 E.CODE 為假,控制將跳轉到 E.FALSE,這將導致執行 S 之後的下一條語句。
∴ E. FALSE = S. NEXT
" 𝐒 → 𝐰𝐡𝐢𝐥𝐞 𝐄 𝐝𝐨 𝐒𝟏 " 的語法制導翻譯。
| 產生式 | 語義規則 |
|---|---|
| 𝐒 → 𝐰𝐡𝐢𝐥𝐞 𝐄 𝐝𝐨 𝐒𝟏 | S. BEGIN = newlabel; E. TRUE = newlabel; E. FALSE = S. NEXT; S1. NEXT = S. BEGIN; S. CODE = GEN(S. BEGIN '− ') | | E. CODE | | GEN(E. TRUE '− ')| | S1. CODE | | GEN('goto' S. BEGIN) |
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP