編譯器設計中整數型別的賦值語句是什麼?
賦值語句由表示式組成。它只涉及整型變數。
抽象翻譯方案
考慮包含賦值語句的語法。
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 = E | GEN(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 | 無 |
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP