編譯器設計中整數型別的賦值語句是什麼?


賦值語句由表示式組成。它只涉及整型變數。

抽象翻譯方案

考慮包含賦值語句的語法。

S → id = E

E → E + E

E → E ∗ E

E → −E

E → (E)

E → id

這裡 E 的翻譯可以有兩個屬性 -

  • 𝐄. 𝐏𝐋𝐀𝐂𝐄− 它說明了將儲存表示式值的名稱。
  • 𝐄. 𝐂𝐎𝐃𝐄− 它表示一個三地址語句序列,用於評估語法中表示賦值語句的表示式 E。E. CODE 表示語句的三地址程式碼。左側非終結符的 CODE 是右側每個非終結符的 CODE 的串聯。


                                                    抽象翻譯方案

產生式語義動作
S → id = E{S. CODE = E. CODE| |id. PLACE| | '=. '||E. PLACE}
E → E(1) + E(2){T = newtemp( );
E. PLACE = T;
E. CODE = E(1). CODE | |E(2). CODE| |
E. PLACE
| | '=' | |E(1). PLACE | | '+' | |E(2). PLACE }
E → E(1) ∗ E(2){T = newtemp( );
 E. PLACE = T;
E. CODE = E(1). CODE | |E(2). CODE | |
E. PLACE | | '=' | |E(1). PLACE
| | '*' | |E(2). PLACE }
E → −E(1){T = newtemp( );
E. PLACE = T;
E. CODE = E(1). CODE
| |E. PLACE | | '=−' | |E(1). PLACE
 }
E → (E(1)){E. PLACE = E(1). PLACE;
E. CODE = E(1). CODE }
E → id{E. PLACE = id. PLACE;
 E. CODE = null; }

在**第一個產生式**S → id = E 中,

id. PLACE| | '=' | | E. PLACE 是一個字串,它跟隨 S. CODE = E. CODE。

在**第二個產生式**E → E(1) + E(2) 中,

E. PLACE| | '=' | | E(1). PLACE | | '+' | | E(2). PLACE 是一個字串,它附加到 E. CODE = E(1). CODE ||E(2). CODE。

在**第五個產生式**,即 E → (E(1)) 中,沒有字串跟隨 E. CODE = E(1). CODE。這是因為它在產生式的右側沒有任何運算子。

類似地,**第六個產生式**也沒有在 E. CODE = null 後附加任何字串。第六個產生式包含 null,因為產生式的右側沒有表示式出現。因此,由於不存在表示式,所以不存在 CODE 屬性,因為 CODE 表示評估表示式的三地址語句序列。

它在其右側包含 id,它是終結符,但不是表示式。我們也可以使用過程**GEN (Statement)**來代替 S. CODE & E. CODE,因為 GEN 過程會自動生成三地址語句。

因此,GEN 語句將替換 CODE 語句。

替換 CODE 定義的 GEN 語句

產生式語義動作
S → id = EGEN(id. PLACE = E. PLACE)
E → E(1) + E(2)GEN(E. PLACE = E(1). PLACE + E(2). PLACE
E → E(1) ∗ E(2)GEN(E. PLACE = E(1). PLACE ∗ E(2). PLACE
E → −E(1)GEN(E. PLACE = −E(1). PLACE)
E → (E(1))
E → id

更新於: 2021-11-05

5K+ 瀏覽量

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告