基本形式:
if(condition)
{
statement1;
}
else
{
statement2;
}
中间代码形式:
do cond1
OP_JF cond _else
do state1
OP_JMP _exit
_else:
do stat2
_exit:
框架:
1.if首部生成_else标签以及跳转指令OP_JF
2.else首部生成OP_JMP跳转指令以及添加标签 _else和产生标签 _exit
3.else尾部添加标签_exit
4.if尾部在else语句不存在时生成_else标签
基本形式:
switch(condition)
{
case label1: statement1
case label2: statement2
....
default:
}
注:一般statemen语句内都有break语句来结束后面的运行
中间代码形式:
do cond
OP_JNE case_1 lb_1 cond
do state1
case_1:
OP_JNE case_2 lb_2 cond
do state2
case_2:
...
default:
do default
_exit:
框架:
1.switch首部产生出口指令_exit,目的是为了break语句的代码生成提供标签信息
2.case首部产生跳转的case_x的指令OP_JNE,条件为比较常量标签lb_x与cond的结果是否相同
3.case尾部生成退出标签case_x
4.switch尾部生成语句退出标签_exit
注:default并不用产生任何标签。
基本形式
while(condition)
{
statement;
}
中间代码形式
_while:
do cond
OP_JF cond
do loop
OP_JMP _while
_exit:
框架:
1.while首部:创建循环入口标签_while并添加,和出口标签 _exit并保存
2.while条件:计算cond,生成目标标签为_exit的OP_JF指令
3.while尾部:产生OP_JMP指令并生成_exit指令
基本形式:
do
{
statement;
}
while(condition);
中间代码形式:
_do:
do loop #注意是先执行语句再判断
do cond
OP_JT cond _do
_exit:
框架:
1.do首部创建循环入口标签do并添加和出口标签_exit。
2.do尾部处理循环条件,产生OP_JT指令,并添加标签_exit
基本形式:
for(init; cond; step)
{
statement;
}
中间代码形式:
do init
_for:
do cond
OP_JF cond _exit
do loop
do step
OP_JMP _for
_exit:
事实上,代码扫描顺序是先step再loop,因此为了翻译方便,改进如下:
do init
_for:
do cond
OP_JF cond _exit
OP_JMP _block
_step:
do step
OP_JMP _for
_block:
do loop
OP_JMP _step
_exit:
这样的翻译方式使得与代码扫描方式一致,不过缺点是降低了一定的性能
框架:
1.for首部,产生_for标签并添加,并且同时产生 _exit和 _block标签。
2.step首部,产生目标位_exit的OP_JF指令和目标为 _block的OP_JMP指令,产生 _step标签并添加
3.block首部,产生_for目标的OP_JMP指令,添加 _block标签
4.block尾部,产生目标为_step的OP_JMP指令,并添加 _exit指令
break: 产生到循环(或者switch)出口的无条件跳转
continue: 产生到循环入口的无条件跳转
通过一个栈来管理循环入口和出口标签,每次执行break或者continue语句时就弹出标签进行跳转。