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 循环的区别,就是少了第一个跳转指令的生成。
 

你可能感兴趣的:(LCC编译器的源程序分析(31)do while循环语句)