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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License