[转载]LCC编译器的源程序分析(38)return语句

来源:互联网 发布:linux rar安装 编辑:程序博客网 时间:2024/06/09 16:19
在实现中,程序其实就是处理数据,然后输出处理过的结果,在C语句里最直接的方式就是函数的返回值。比如求两个数据的最大值,就可以通过函数返回值来返回最大值。而函数的返回值是通过函数中的return语句获得的。return语句后面是一个表达式,需要调用表达式函数来处理。
下面来分析LCC里的代码:
#001 case RETURN: 
#002         {
#003               Type rty = freturn(cfunc->type);
#004               t = gettok();
#005               definept(NULL);
3行取得函数返回值的类型。
4行获取下一个记号。
5行定义了执行点。
 
#006               if (t != ';')
#007                    if (rty == voidtype)
#008                    {
#009                          error("extraneous return value/n");
#010                          expr(0);
#011                          retcode(NULL);
#012                    }
#013                    else
#014                          retcode(expr(0));
#015               else
#016               {
#017                    if (rty != voidtype)
#018                    {
#019                          warning("missing return value/n");
#020                          retcode(cnsttree(inttype, 0L));
#021                    }
#022                    else
#023                          retcode(NULL);
#024               }
#025               branch(cfunc->u.f.label);
#026         }
6行是判断是否返回空值,如果返回空值就进入第16到到23行处理。
7行判断函数返回值类型是否为空,如果函数返回值是空,那么return语句的返回值一定要为空,否则就是出错。第9行就是提示出错,第10行是处理表达式,第11行返回空值。
14行是处理返回值的类型不为空的处理,它是调用函数expr来处理return语句后面的表达式。
17行是处理空类型的返回值,如果不为空值就在第19行里给出警告。
20行返回相应的类型的0值。
23行是返回空类型的处理。
25行跳转到函数结束的标号运行。
 
#027         expect(';');
#028         break;
#029 
27行是处理是否分号结束。
 
返回语句主要进行表达式处理和类型判断,以及返回值的类型转换。