布尔表达式有两个主要目的。它们用于计算逻辑值。它们还用作使用if-then-else或while-do的条件表达式。
考虑语法
E → E OR E
E → E AND E
E → NOT E
E → (E)
E → id relop id
E → TRUE
E → 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’)} |
EMIT函数用于生成三个地址代码, 而newtemp()函数用于生成临时变量。
E→id relop id2包含next_state, 并给出输出序列中下三个地址语句的索引。
这是使用上述转换方案生成三个地址代码的示例:
p>q AND r<s OR u>r
100: if p>q goto 103
101: t1:=0
102: goto 104
103: t1:=1
104: if r>s goto 107
105: t2:=0
106: goto 108
107: t2:=1
108: if u>v goto 111
109: t3:=0
110: goto 112
111: t3:= 1
112: t4:= t1 AND t2
113: t5:= t4 OR t3
评论前必须登录!
注册