編譯器設計中控制語句的翻譯是什麼?


控制語句是可以改變語句執行流程的語句。

考慮語法

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)

更新於: 2021年11月5日

13K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.