栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UCC编译器学习笔记13

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UCC编译器学习笔记13

我们来思考个问题:

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 所示的类型结构

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/856308.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号