Done with Function Call
函数调用部分也基本上搞定了。这次还修改了前面的一些翻译方案,加入了赋值是类型判断的功能。内置有5种类型:VOID、INT、LONG、FUNC、ARRAY。类型完全相同当然视为匹配。其次,INT->LONG的自动转化也视为可以接受的。但是LONG->INT将输出一条Waring信息。其余的情况被视为类型匹配错误,直接终止编译过程。类型判断在赋值语句和函数调用语句是执行,检查左值和右值的类型是否匹配。不匹配的情况主要发生在数组和基类型间的错误赋值、返回VOID的函数赋值给其他类型。
函数调用的相关产生式为:
- Factor->Function_caller
- Function_caller->IDENTIFIER ( )
- Function_caller->IDENTIFIER ( Argument_list )
- Argument_list->Argument_list , Expression
- Argument_list->Expression
传入参数的四元式为”param Var_Name”,函数调用的为”call Func_Name Param_Num Ret_Var”(其中Param_Num为参数个数,Ret_Var为接受函数返回值的临时变量)。
明天的任务差改写Boolean语句、条件分支语句、循环语句的部分了,这些都很容易。唯一值得关注的是函数返回的值的地址的确定——因为在分析return语句是还不知道该函数所有变量的空间大小(我的文法支持变量到处定义),返回值的地址通常是放在所有变量的偏移量之后——这里用回填的方法进行处理。
Labels: Pallyc Project

0 Comments:
Post a Comment
<< Home