C语言解释器的实现--类型解析(三)
1.类型的表示
C语言的类型是相当灵活的,除了标准的类型(int char float double long 等等)外,自己根据需求,能定义出无穷的类型。一个具体的例子:
int * a[10];
它表示的意思是:
a is ARRAY 0..9 of POINTER to INT
仔细观察它的意思,就会发现,这个类型是其他基本类型按照一定顺序的组合:ARRAY|POINTER|INT。要表示这种形式,链表是最合适不过的了。如下图:
(图2.1类型的表示)
还有一些情况,比如结构体类型,那么上述的表示就不大合适了。例如下面的结构体:
struct _a{
int n;
char * p[10];
};
结构中的每个域分别是由一个个的类型组成的。那么,我们可以用一个类型链表组成。具体就是:
_a is STRUCT of
n: INT
p: ARRAY 0..9 of POINTER to INT
如下图所示:
(图2.2结构体的表示)
程序中的类型定义如下:
typedef struct type_t ttype_t;
typedef struct type_t * ptype_t;
typedef struct type_list_t ttype_list_t;
typedef struct type_list_t * ptype_list_t;
struct type_t{
int bty;
int size;
ptype_t ty;
ptype_list_t sty;
char * name;
char * tag;
char * pos;
};
struct type_list_t{
ptype_t ty;
ptype_list_t next;
};
2.类型解析
定义一个类型,我们可以把它分成三个部分:
specifier + id + dclor
对应到一个具体的定义:int * p[10]; 这三部分分别是:
specifier int *
id p
dclor [10]
类型的解析过程是这样的,首先找到id,然后根据一个规则(向右再向左),依次解析出这个类型:
(图2.3类型的解析过程)
在第2步,有几种情况:
a. [ 表示数组,如果遇到[ 则进入解析数组函数
b. ( 表示函数,如果遇到( 则进入解析参数列表函数
所以我们的解析函数是这样的:
void dclor( ptype_t ty ){
switch( *token ){
case ALY: dcl_arrays(ty); break;
case '(': ty->pos = prog; dcl_args(ty); break;
}
dcl_pointers(ty);
while(tok_top >= 0){
if( *tok_stack[tok_top].token == '(' ){ //左边是( 继续向右解析
token_pop();
get_token();
dclor(ty);
}
else{
struct token_node node;
node = token_pop();
if( strcmp( node.token, "splitor" ) == 0 ){
//结束
break;
}
if( node.ty != NULL ){
sbt.ty = node.ty;
}
dcl_specifier( node.tok, NULL );
}
}
}
对于类型的解析,我这里推荐下《C专家编程》中的类型解释部分,里面讲解得更加透彻。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述