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 行是处理是否分号结束。
 
返回语句主要进行表达式处理和类型判断,以及返回值的类型转换。
 

你可能感兴趣的:(c,null,编译器,branch)