什么是布尔表达式?


布尔表示 **真** 或 **假**。它也可以用 **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

更新于: 2021年11月5日

5K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告