什麼是布林表示式?
布林表示 **真** 或 **假**。它也可以用 **1 或 0** 表示。
布林表示式是指返回真或假的表示式。布林表示式可以透過兩種方式表示:
條件表示式
For example, If a > b{ cout<<"a is greater than b"; }
這裡 a > b 是一個條件表示式,可以為真或假。
邏輯表示式
這些表示式包含邏輯運算子,即 OR、AND、NOT 應用於運算元。
例如:
- 𝐄 𝐎𝐑 𝐄 → 如果任何一個表示式為真,則返回真。
- 𝐄 𝐀𝐍𝐃 𝐄 → 如果兩個表示式都為真,則返回真。
- 𝐍𝐎𝐓 𝐄 → 如果表示式 𝐄 為假,則返回真;如果 𝐄 為真,則返回假。
優先順序方面,NOT 優先順序最高,然後是 AND,最後是 OR 優先順序最低。
布林表示式的翻譯
考慮以下語法
𝐄 → 𝐄 𝐎𝐑 𝐄 𝐄 → 𝐓𝐑𝐔𝐄
𝐄 → 𝐄 𝐀𝐍𝐃 𝐄 𝐄 → 𝐢𝐝𝟏𝐫𝐞𝐥𝐨𝐩 𝐢𝐝𝟐
𝐄 → 𝐍𝐎𝐓 𝐄 𝐄 → (𝐄)
𝐄 → 𝐅𝐀𝐋𝐒𝐄
布林表示式的語法制導翻譯
產生式 | 語義規則 |
---|---|
E → E(1)𝐎𝐑 E(2) | { E. PLACE = newtemp( ); GEN(E. PLACE = E(1). PLACE 𝐎𝐑 E(2). PLACE) } |
E → E(1)𝐀𝐍𝐃 E(2) | { E. PLACE = newtemp( ); GEN(E. PLACE = E(1). PLACE 𝐀𝐍𝐃 E(2). PLACE) } |
E → 𝐍𝐎𝐓 E(1) | { E. PLACE = newtemp( ); GEN(E. PLACE = 𝐍𝐎𝐓 E(1). PLACE) } |
E → (E(1)) | { E. PLACE = E(1). PLACE } |
E → id1𝐫𝐞𝐥𝐨𝐩 id2 | { E. PLACE = newtemp( ); GEN(if id1. PLACE 𝐫𝐞𝐥𝐨𝐩 id2. PLACE goto nextquad + 3); GEN(E. PLACE = 0); GEN(goto nextquad + 2); GEN(E. PLACE = 1) } |
E → TRUE | { E. PLACE = newtemp( ); GEN(E. PLACE = 1) } |
E → FALSE | { E. PLACE = newtemp( ); GEN(E. PLACE = 0) } |
𝐧𝐞𝐰𝐭𝐞𝐦𝐩( ) 將建立一個新的臨時變數。
𝐄. 𝐏𝐋𝐀𝐂𝐄 將表示儲存表示式值的名稱。
𝐏𝐫𝐨𝐜𝐞𝐝𝐮𝐫𝐞 𝐆𝐄𝐍 (𝐬𝐭𝐚𝐭𝐞𝐦𝐞𝐧𝐭) 將為特定語句生成三地址程式碼,並將語句中出現的運算子和運算元插入四元組。
**'nexquad'** 是下一個三地址程式碼語句(四元組陣列)的索引。
將 newtemp( ) 替換為 E. PLACE 將重新整理 E. PLACE 的值。
**示例 1**:將以下表達式轉換為三地址程式碼序列。
(a) X AND Y OR C
(b) X OR Y AND NOT C
解決方案
𝐗 𝐀𝐍𝐃 𝐘 𝐎𝐑 𝐂
T1 = X AND Y
T2 = T1 OR C
𝐗 𝐎𝐑 𝐘 𝐀𝐍𝐃 𝐍𝐎𝐓 𝐂
T1 = NOT C
T2 = Y AND T1
T3 = X OR T2
∴ NOT 優先順序最高,然後是 AND,最後是 OR 優先順序最低。
**示例 2**:為以下語句編寫三地址程式碼
If (A < B OR X > Y)
A = B + C
解決方案
(1) If A < B goto(4)
(2) If X > Y goto(4)
(3) goto(6)
(4) T = B + C
(5) A = T
**示例 3**:為 a > b 𝐀𝐍𝐃 c < d 𝐀𝐍𝐃 e < f 編寫三地址程式碼。
解決方案
(1) If a > b goto(4)
(2) t1 = 0
(3) goto(5)
(4) t1 = 1
(5) If c < d goto(8)
(6) t2 = 0
(7) goto(9)
(8) t2 = 1
(9) If e < f goto(12)
(10) t3 = 0
(11) goto(13)
(12) t3 = 1
(13) t4 = t1 𝐀𝐍𝐃 t2
(14) t5 = t4 𝐀𝐍𝐃 t3