控制流

布尔表达式的控制流翻译

生成的代码执行时跳转到两个标号之一:

  • 表达式的值为真时,跳转到B.true

  • 表达式的值为假时,跳转到B.false

B.true和B.false是两个继承属性根据B所在的上下文指向不同的位置

  • 如果B是if语句条件表达式,分别指向then和else分支;如果,则B.false指向if语句的下一个指令

  • 如果B是while语句的条件表达式,分别指向循环体的开头和循环体的出口处

控制流语句:

S if (B)S1S if (B)S1 else S2S while (B)S1\begin{array}{l} S \rightarrow \text { if }(B) S_{1} \\ S \rightarrow \text { if }(B) S_{1} \text { else } S_{2} \\ S \rightarrow \text { while }(B) S_{1} \end{array}

继承属性

  • B.true:B为真时的跳转目标

  • B.false:B为假时的跳转目标

  • S.next:S执行完毕时的跳转目标

布尔表达式的翻译

布尔表达式可以用于改变控制流/计算逻辑值

文法:

BBBB&&B!B(B)E rel E true |false B \rightarrow B \| B|B \& \& B|!B|(B)| E \text { rel } E \mid \text { true |false }

语义:和布尔表达式的计算结果一致

短路求值:

  • 通过跳转指令实现控制流,逻辑运算符本身不出现

  • B1||B2中B1为真时,无需计算B2,整个表达式为真,因为,当B1为真时应该跳过B2的代码

  • B1&&B2中B1为假时,无需计算B2,整个表达式为假,因此,当B1为假时应该跳过B2的代码

短路代码的例子
布尔表达式代码的例子

布尔值和跳转代码

程序中出现布尔表达式也可能是求值:x = a < b

处理方法:建立表达式的语法树,根据表达式的不同角色来处理。

文法:

Sid=B; if (B)S while (B)SSSBBBB&&B!BE rel E\begin{array}{l} S \rightarrow \mathrm{id}=B ; \mid \text { if }(B) S \mid \text { while }(B) S \mid S S \\ B \rightarrow B \| B|B \& \& B|!B \mid E \text { rel } E \mid \ldots \end{array}

根据B的语法树结点所在的位置:

  • S->while(B) S1中的B,生成跳转代码

  • 对于S->id=B,生成计算右值的代码

例子

Last updated