4.3 对语句Statement的语义检查
在这一节中,我们来分析一下对语句Statement的语义检查,与其相关的代码在stmtchk.c中。图4.3.1第1至16行的数组StmtCheckers,给出了用于对各语句进行语义检查的函数表,第17行的CheckStatement(stmt)函数根据参数stmt的kind域来查这个函数表,由函数指针来调用相应的函数完成语义检查,如图第18行所示。这样的代码结构我们在对表达式进行语义检查时,也在exprchk.c中遇过。
图4.3.1 CheckStatement()
在完成对表达式语义检查的基础上,再对switch和while等语句进行语义检查就相对容易了许多。图4.3.1第15行的CheckLocalCompound用于对复合语句进行语义检查,其代码如图4.3.2第20至26行所示。复合语句的左大括号表示了一个新的作用域的开始,我们需要创建新的符号表来存放在该作用域中声明的符号,第22行调用的EnterScope函数中完成了创建新符号表的工作。在图4.3.2第30行,我们把“代表符号表所在作用域深度”的全局变量Level加1,第31至35于创建一个用于存放变量名和函数名的新符号表,由第33行的outer指向外层(深度较浅的)符号表,第35行的全局变量Identifiers始终指向与当前作用域对应的标志符符号表(存放变量名和函数名等);第37至42行用于创建一个新的用于存放结构体名、枚举名和联合体名的符号表