这一节,我们准备初步讨论一下UCC编译器的符号表管理,与符号表管理相关的代码主要在ucl\symbol.h和ucl\symbol.c中。UCC编译器内部需要对用到的所有符号进行分类,并建立相应的数据结构来记录与符号相关的信息。图2.5.1第25行的结构体struct symbol用于记录与符号相关的信息,这些信息如图第7至23行所示。第8行的kind用于区别不同类别的符号,其取值范围如图第1至5行所示;第9行的name用于记录符号的名称;第11行的ty用于记录符号的类型,第23行的pcoord用于记录符号所在的文件位置,在调试时方便定位。其余各行的作用我们以后会结合上下文进行讨论。
图2.5.1 struct symbol
下面,我们结合一个具体的C程序来熟悉一下UCC编译器内部对符号所做的分类,如图2.5.2所示。
图2.5.2 各种不同类型的符号
在图2.5.2的第1至18行,是一个简单的C程序,而第20至30行是由UCC编译器产生的中间代码。结合图2.5.1和图2.5.2,我们能看到以下几种不同的符号:
(1) 结构体名Data和枚举名Color,对应的类别为SK_Tag;
(2) 由关键字typedef给已有类型int取的别名INT32,对应的类别为SK_TypedefName;
(3) 枚举常量RED、GREEN和BLUE,对应的类别为SK_EnumConstant;
(4) 常量3,对应的类别为SK_Constant;
(5) 全局变量名dt、a、b、c、d和局部变量hi,对应的类别为SK_Variable;
(6) 临时变量t0、t1和t2,对应的类别为SK_Temp;
(7) 用于访问结构体成员的dt.num2,经UCC编译器处理后,我们更关注域成员num2