1.1 语法成分检查
该部分检查是为了弥补语法分析,对一些含义不明的语法成分进行更加具体的分类,便于后续语义分析和代码生成。
1.1.1 _VariantReference种类检查
首先需要在_VariantReference的节点定义中添加string kind域,表示变量引用的具体类型,还添加了int locFlag域,当取值为-1时,表示当前变量引用出现在了赋值语句的左侧,其它情况均用取值为1来表示。
由于语法分析时,无法得知语义信息,所以许多语法成分都被归到了_VariantReference节点类中。可能是变量、常量、数组元素引用、函数调用时作为右值、函数返回值中作为左值。所以kind的取值情况如下:
variantReference的种类 | kind取值 |
---|---|
变量 | var |
常量 | constant |
数组元素 | array |
函数无参调用,作为右值 | function call |
函数返回值语句,作为左值 | function return reference |
当_Expression的type取值为“var”时,该表达式就是由_VariantReference构成的最简单的表达式,即退化为了_VariantReference的情形。
1.1.2 _Statement是否是返回语句
扩充_Statement的类定义,加入bool isReturnStatement域。
1.1.2.1 赋值语句
如果赋值语句的左值是当前所在的函数名,即对左值_VariantReference进行语义检查,发现其是当前所在的函数名,则该赋值语句是一条返回值语句。
1.1.2.2 过程调用
如果是exit过程调用,则该过程调用语句就是返回语句。出现在过程定义中时,exit应不带实参;出现在函数中时,exit应带一个实参。