4.1 语义检查简介
在这一章中,我们需要在语法分析阶段建立的语法树的基础上,进行语义检查。UCC编译器中与此相关的代码主要在ucl\declchk.c,ucl\stmtchk.c和ucl\exprchk.c,分别用于对声明Declaration、语句Statement和表达式Expression进行语义检查SemanticsCheck。其中,最重要的工作就是建立C语言的类型系统,我们在第2.4节时就已简单介绍过C语言的类型系统。在阅读这部分代码时,一定需要结合语法树进行,看起来比较笨但却很管用的办法是,把第3章中我们构造出来的语法树画在纸质的笔记本上,对照着语法树,才不至于迷失方向。我们就如一只猴子,在语法树上跳来跳去进行语义检查。在如此枝繁叶茂的语法树上,如果没有对应的图纸做导航,很快就会“云深不知处”了。
按UCC编译器的正常执行流程,我们需要先为变量名和函数名建立起类型信息,这部分工作就主要是在declchk.c中进行,之后再进行语句和表达式的语义检查。我们反复强调过,通过声明Declaration,C程序员实际上建立了类型表达式,UCC编译器会在语义检查时,为变量名和函数名等标志符建立起相应的类型结构。在第2.4节时,我们已初步介绍了在UCC编译器中,整数、函数、结构体、数组和指针等类型结构在UCC编译器内部是如何表示的。而ucl\declchk.c中的代码