LCC编译器的源程序分析(31)do while循环语句

do—while 语句是实现“直到型”循环结构。一般形式如下:
do
{
  语句 1
}while( 表达式 )
 
上面的语句是这样的执行的,先执行一次语句 1 ,然后判断表达式的值,如果表达式的值为真,也就是非零时,返回重新执行语句 1 ,如此反复,直到表达式的值等于 0 为止。这个表达式与前面一个 while 语句的区别,就是表达式值的判断和语句 1 执行先后的问题。前面 while 语句先判断后执行语句 1 ,而 do—while 语句是先执行后判断。在 LCC 里是通过下面的函数 dostmt 来实现这个语句的处理。
#018  case DO:      
#019         dostmt(genlabel(3), swp, lev + 1);
#020         expect(';');
#021         break;
 
dostmt 函数的代码如下:
#001 static void dostmt(int lab, Swtch swp, int lev)
#002 {
#003  refinc *= 10.0;
#004  t = gettok();
#005  definelab(lab);
#006  statement(lab, swp, lev);
#007  definelab(lab + 1);
#008  expect(WHILE);
#009  expect('(');
#010  definept(NULL);
#011  walk(conditional(')'), lab, 0);
#012  if (findlabel(lab + 2)->ref)
#013         definelab(lab + 2);
#014 }
4 行是获取下一个记号。
5 行是定义第一个标号。
6 行是处理 do—while 中的语句。
7 行是定义第二个标号。
8 行是测试 WHILE 是否存在。
11 行处理条件表达式,如果条件不等于 0 就跳转到第一个标号那里处理。
12 行是查看是否需要生成第三个标号,主要是在循环里跳出来的语句准备的。
 
生成的代码形式如下:
标号 1 :语句 1
标号 2 :如果 条件表达式不等于 0 就跳转到标号 1 运行
标号 3
它与 while 循环的区别,就是少了第一个跳转指令的生成。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值