Skip to content

Latest commit

 

History

History
206 lines (143 loc) · 3.29 KB

语句设计.md

File metadata and controls

206 lines (143 loc) · 3.29 KB

if 语句

基本形式:

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语句

基本形式:

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语句

基本形式

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 while语句

基本形式:

do
{
    statement;
}
while(condition);

中间代码形式:

_do:
	do loop #注意是先执行语句再判断
	do cond
	OP_JT cond _do
_exit:

框架:

1.do首部创建循环入口标签do并添加和出口标签_exit。

2.do尾部处理循环条件,产生OP_JT指令,并添加标签_exit

for 语句

基本形式:

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,continue语句

break: 产生到循环(或者switch)出口的无条件跳转

continue: 产生到循环入口的无条件跳转

通过一个栈来管理循环入口和出口标签,每次执行break或者continue语句时就弹出标签进行跳转。

image-20210525204725297