控制流
布尔表达式
CRE:布尔运算符作用于布尔变量或者关系表达式就是布尔表达式。
布尔运算符:||
、&&
、!
。
比较运算符:<
、>
、<=
、>=
、==
、!=
。
CRE:布尔表达式的各个部分不一定都要完全求值,有时候对部分求值就可以确定整个表达式的值了。称为“短路”。
布尔表达式的两种角色(作为布尔值和作为跳转代码)
布尔表达式有两种角色:
- 例如出现在
S-> while(B) S1
中的E,这是用于改变语句中控制流的布尔表达式。(对表达式的节点调用方法jump()
方法) - 例如出现在
S -> id = E;
中的E,这是取它的布尔值。(对表达式的节点调用rvalue()
方法)
CRE:需要对表达式的抽象语法树或者整个输入的完整抽象语法树进行两趟处理。
短路代码
CRE:在短路代码中,布尔运算&&、 、!可以被被翻译成跳转指令。
if( x < 100 || x > 200 && x != y) x = 0;
//翻译为:
// if x < 100 goto L2
// ifFalse x > 200 goto L1
// ifFalse x != y goto L1
//L2: x = 0
//L1:
控制流\布尔表达式翻译
CRE:在翻译控制流语句时,有些属性例如
S.next
是继承属性,需要先构造语法树,然后在自顶向下遍历树的过程中确定继承属性。
CRE:在形如S -> if (B) S1 else S2
的产生式中,如果自底向上分析,是无法确定S2、S1的next
属性的,需要自顶向下遍历语法树把S的next
赋值给S1和S2。
CRE:不仅仅流程控制语句可翻译为跳转语句,布尔表达式中的布尔运算符也可以直接翻译为跳转语句。
(详见《编译原理》p258 - p262)
(END)