什么是布尔表达式?
布尔表示 **真** 或 **假**。它也可以用 **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