布尔表达式有两个主要目的。它们用于计算逻辑值。它们还用作使用if-then-else或while-do的条件表达式。
考虑语法
E→E OR EE→E AND EE→NOT E E→(E)E →id relop idE→TRUEE→FALSE
该relop用< , > , < , > 表示。
AND和OR保持关联。与AND和最后OR相比, NOT的优先级更高。
生产规则 | 语义动作 |
---|---|
E→E1或E2 | {E.place = newtemp(); 发射(E.place’ :=’ E1.place’ OR’ E2.place)} |
E→E1 + E2 | {E.place = newtemp(); 发射(E.place’ :=’ E1.place’ AND’ E2.place)} |
E→不是E1 | {E.place = newtemp(); 发射(E.place’ :=” NOT’ E1.place)} |
E→(E1) | {E.place = E1.place} |
E→id relop id2 | {E.place = newtemp(); 发射(’ if’ id1.place relop.op id2.place’ goto’ nextstar + 3); EMIT(E.place’ :=” 0’ )EMIT(’ goto’ nextstat + 2)EMIT(E.place’ :=” 1’ )} |
E→真 | {E.place:= newtemp(); 发射(E.place’ :=” 1’ )} |
E→假 | {E.place:= newtemp(); 发射(E.place’ :=” 0’ )} |
E→id relop id2包含next_state, 并给出输出序列中下三个地址语句的索引。
【布尔表达式】这是使用上述转换方案生成三个地址代码的示例:
p>
q AND r<
s OR u>
r100: if p>
q goto 103101: t1:=0102: goto 104103: t1:=1104: if r>
s goto 107105: t2:=0106: goto 108107: t2:=1108: if u>
v goto 111109: t3:=0110: goto 112111: t3:= 1112: t4:= t1 AND t2113: t5:= t4 OR t3