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

在实现中,程序其实就是处理数据,然后输出处理过的结果,在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行是处理是否分号结束。

返回语句主要进行表达式处理和类型判断,以及返回值的类型转换。

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