[转载]LCC编译器的源程序分析(30)while循环语句
来源:互联网 发布:极域电子教室网络锁屏 编辑:程序博客网 时间:2024/05/19 06:47
while语句的语义是这样定义的:
while(表达式) 语句1
当表达式为非0值时执行while语句中的内嵌语句1。其特点就是先判断表达式的值,然后再执行语句。LCC是通过下面的代码来处理这个语句的:
#015 case WHILE:
#016 whilestmt(genlabel(3), swp, lev + 1);
#017 break;
上面第16行语句里,第一个参数genlabel(3)是指while语句使用三个标号。第二参数swp是指明是否在switch语句里。第三个参数是指明递归调用次数。
然后调用函数whilestmt处理。
#001 static void whilestmt(int lab, Swtch swp, int lev)
#002 {
#003 Coordinate pt;
#004 Tree e;
#005
#006 refinc *= 10.0;
#007 t = gettok();
#008 expect('(');
第7行获取下一个记号。
第8行测试下一个是否左括号开始。
#009 walk(NULL, 0, 0);
#010 pt = src;
#011 e = texpr(conditional, ')', FUNC);
第9行是复位分配的内存。
第10行是保存当前源程序位置。
第11行是调用函数conditional来处理条件表达式。
#012 branch(lab + 1);
#013 definelab(lab);
#014 statement(lab, swp, lev);
#015 definelab(lab + 1);
#016 definept(&pt);
#017 walk(e, lab, 0);
#018 if (findlabel(lab + 2)->ref)
#019 definelab(lab + 2);
#020 }
第12行是处理标号2分支。
第13行是定义标号1。
第14行是处理语句1。
第15行是定义标号2.
第16行是定义执行点。
第17行是对条件表达式生成DAG代码。
第18行是判断是否需要生成标号3。
while语句最终生成的汇编代码有下面的形式:
跳转到标号2
标号1:语句1
标号2:如果条件表达式不等于0 就跳转到标号1运行
标号3:
上面的标号3是为了方便里面有跳转语句跳出循环体的,比如使用goto、break、return等等,就需跳到标号3运行。
<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>
- [转载]LCC编译器的源程序分析(30)while循环语句
- LCC编译器的源程序分析(30)while循环语句
- LCC编译器的源程序分析(31)do while循环语句
- [转载]LCC编译器的源程序分析(31)do while循环语句
- [转载] LCC编译器的源程序分析(32)for循环语句
- LCC编译器的源程序分析(32)for循环语句
- [转载] LCC编译器的源程序分析(20)复合语句
- [转载]LCC编译器的源程序分析(27)基本语句
- [转载]LCC编译器的源程序分析(28)函数表达式语句
- [转载]LCC编译器的源程序分析(29)if条件语句
- [转载]LCC编译器的源程序分析(33)break语句
- [转载] LCC编译器的源程序分析(34)continue语句
- [转载]LCC编译器的源程序分析(35)switch语句
- [转载]LCC编译器的源程序分析(36)case语句
- [转载]LCC编译器的源程序分析(37)default语句
- [转载]LCC编译器的源程序分析(38)return语句
- [转载]LCC编译器的源程序分析(39)goto语句
- [转载] LCC编译器的源程序分析(61)复合语句的代码块流程
- 为了,做一个合格的程序员开始写BLOG!
- SQL连接查询类型
- [转载]LCC编译器的源程序分析(27)基本语句
- [转载]LCC编译器的源程序分析(28)函数表达式语句
- [转载]LCC编译器的源程序分析(29)if条件语句
- [转载]LCC编译器的源程序分析(30)while循环语句
- [转载]LCC编译器的源程序分析(31)do while循环语句
- gdb commands
- oracle分区表学习及应用--转帖
- 需求迭代
- [转载] LCC编译器的源程序分析(32)for循环语句
- 营销的一些概念
- linux's coredump storage
- 国美、海尔、第三方网站——揭秘家电B2C三大势力