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

来源:互联网 发布:极域电子教室网络锁屏 编辑:程序博客网 时间:2024/05/19 06:18
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循环的区别,就是少了第一个跳转指令的生成。
  <script type="text/javascript"><!--google_ad_client = "pub-0904655026211899";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";google_ad_channel = "";google_color_border = "336699";google_color_bg = "FFFFFF";google_color_link = "0000FF";google_color_text = "000000";google_color_url = "008000";//--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击