UCC编译器学习笔记13

UCC编译器学习笔记13,第1张

我们来思考个问题:

int a;

int a[3][4];

假如有两个定义,现在我们要想描述出标识符a的类型信息,我们会怎么做呢,

  • 对于第一句代码:下面的Type类型中的categ置为一个数,即可表明它的类型了。
  • 对于第二句代码:a不仅需要int信息,还有,它是指针信息,还有它是指向int * [3][4]的这些信息,这个仅仅Type类型中的成员是无法表述的了,因此需要最下面的typeDerivList类型,也就是复合类型(这里不是指结构体或者联合体),用来描述该标识符的更多信息。除了数组外,函数,指针,等也属于符合类型,有多个信息需要描述,因此,Type类型中的bty就是用来指向额外的结构体typeDerivList的。该结构体什么时候指向的呢,是在语义检测的时候,DeriveType函数实现的。

#define TYPE_COMMON \   //表示公有的类型,就是各种类型,都需要有这个成员的

    int categ : 8;  \

    int qual  : 8;  \   //constant还是volatile

    int align : 16; \

    int size;       \

    struct type *bty;   //如果有第二类型属性,该指针指向那个基类。如果是函数类型,则这个是返回值的类型

                        //最重要的,如果是指针变量,指针本身是int型,但是bty这个域就是指向的那个类型。举个例,int arr[3][4];

typedef struct type     //要想描述arr的类型,

{

    TYPE_COMMON

} *Type;

----------------------------------------------------------------------------------------------------

typedef struct typeDerivList

{

    int ctor;       // type constructor     pointer / function / array

    union

    {

        int len;    // array size,例如 int arr[3]中的 3

        int qual;   // pointer qualifier,记录指针的限定符(例如” int * const ptr”中的 const)

        Signature sig;  // function signature,sig 用于记录函数形参列表的类型

    };

    struct typeDerivList *next;

} *TypeDerivList;

此外,的例子还有:

static const int *a, a3[5];

int fn(int aa);

它们都属于复合类型,因此需要TypeDerivList结构体的加持,才能充分描述出类型信息。

int * arr1[5];
int (*arr2)[5];

结合 CheckDeclarationSpecifiers 函数所得到的类型信息,遍历如图 4.4.7 中所示的由若
干个 struct TypeDerivList 对象构成的链表,我们就可构建起“第 2.4 节 C 语言的类型系统”
中介绍的类型结构,与此相关的代码如图 4.4.8 所示。

经过 DeriveType()函数的类型推导,我们会为 int * arr1[5]和 int (*arr2)[5]这两个声明分
别构建如图 4.4.9 所示的类型结构

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/797719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存