-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathast.c
207 lines (206 loc) · 11.3 KB
/
ast.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include "def.h"
struct node * mknode(int kind,struct node *first,struct node *second, struct node *third,int pos ) {
struct node *T=(struct node *)malloc(sizeof(struct node));
T->kind=kind;
T->ptr[0]=first;
T->ptr[1]=second;
T->ptr[2]=third;
T->pos=pos;
return T;
}
void display(struct node *T,int indent) {//对抽象语法树的先根遍历
int i=1;
struct node *T0;
if (T)
{
switch (T->kind) {
case EXT_DEF_LIST: display(T->ptr[0],indent); //显示该外部定义列表中的第一个
display(T->ptr[1],indent); //显示该外部定义列表中的其它外部定义
break;
case EXT_VAR_DEF: printf("%*c外部变量定义:\n",indent,' ');
display(T->ptr[0],indent+3); //显示外部变量类型
printf("%*c变量名:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示变量列表
break;
case EXT_STRUCT_DEF: printf("%*c结构体定义:\n",indent,' ');
display(T->ptr[0],indent+3); //显示结构体名
break;
case EXT_ARR_DEF: printf("%*c外部数组定义:\n",indent,' ');
display(T->ptr[0],indent+3); //显示外部变量类型
display(T->ptr[1],indent+6); //显示变量列表
break;
case ARRAY_DEF: printf("%*c内部数组定义:\n",indent,' ');
display(T->ptr[0],indent+3); //显示外部变量类型
display(T->ptr[1],indent+6); //显示变量列表
break;
case STRUCT_DEC: printf("%*c结构体名: %s\n",indent,' ',T->type_id);
display(T->ptr[0],indent+3);
break;
case ARRAY_DEC: printf("%*c数组名: %s\n",indent,' ',T->type_id);
printf("%*c数组大小: \n",indent,' ');
display(T->ptr[0],indent+3);
break;
case TYPE: printf("%*c类型: %s\n",indent,' ',T->type_id);
break;
case EXT_DEC_LIST: display(T->ptr[0],indent); //依次显示外部变量名,
display(T->ptr[1],indent); //后续还有相同的,仅显示语法树此处理代码可以和类似代码合并
break;
case ARR_LIST: display(T->ptr[0],indent); //依次显示外部数组名,
display(T->ptr[1],indent); //后续还有相同的,仅显示语法树此处理代码可以和类似代码合并
break;
case STRUCT_LIST: display(T->ptr[0],indent); //依次显示外部结构体名,
display(T->ptr[1],indent); //后续还有相同的,仅显示语法树此处理代码可以和类似代码合并
break;
case FUNC_DEF: printf("%*c函数定义:\n",indent,' ');
display(T->ptr[0],indent+3); //显示函数返回类型
display(T->ptr[1],indent+3); //显示函数名和参数
display(T->ptr[2],indent+3); //显示函数体
break;
case FUNC_DEC: printf("%*c函数名:%s\n",indent,' ',T->type_id);
if (T->ptr[0]) {
printf("%*c函数形参:\n",indent,' ');
display(T->ptr[0],indent+3); //显示函数参数列表
}
else printf("%*c无参函数\n",indent+3,' ');
break;
case PARAM_LIST: display(T->ptr[0],indent); //依次显示全部参数类型和名称,
display(T->ptr[1],indent);
break;
case PARAM_DEC: printf("%*c类型:%s, 参数名:%s\n", indent,' ', \
T->ptr[0]->type==INT?"int": "float",T->ptr[1]->type_id);
break;
case EXP_STMT: printf("%*c表达式语句:\n",indent,' ');
display(T->ptr[0],indent+3);
break;
case RETURN: printf("%*c返回语句:\n",indent,' ');
display(T->ptr[0],indent+3);
break;
case BREAK: printf("%*c退出语句:\n",indent,' ');
break;
case CONTINUE: printf("%*c继续执行下一次循环:\n",indent,' ');
break;
case COMP_STM: printf("%*c复合语句:\n",indent,' ');
printf("%*c复合语句的变量定义:\n",indent+3,' ');
display(T->ptr[0],indent+6); //显示定义部分
printf("%*c复合语句的语句部分:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示语句部分
break;
case STRUCT_DEF_LIST:
printf("%*c结构体中的变量定义:\n",indent+3,' ');
display(T->ptr[0],indent+6); //显示定义部分
break;
case STM_LIST: display(T->ptr[0],indent); //显示第一条语句
display(T->ptr[1],indent); //显示剩下语句
break;
case WHILE: printf("%*c循环语句:\n",indent,' ');
printf("%*c循环条件:\n",indent+3,' ');
display(T->ptr[0],indent+6); //显示循环条件
printf("%*c循环体:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示循环体
break;
case FOR: printf("%*c循环语句:\n",indent,' ');
printf("%*c循环条件:\n",indent+3,' ');
display(T->ptr[0],indent+6);
printf("%*c循环体:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示循环体
break;
case FOR_CONDITION: printf("%*c循环初始条件:\n",indent,' ');
display(T->ptr[0],indent+3);
printf("%*c循环结束条件:\n",indent,' ');
display(T->ptr[1],indent+3);
printf("%*c循环步进条件:\n",indent,' ');
display(T->ptr[2],indent+3);
case IF_THEN: printf("%*c条件语句(IF_THEN):\n",indent,' ');
printf("%*c条件:\n",indent+3,' ');
display(T->ptr[0],indent+6); //显示条件
printf("%*cIF子句:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示if子句
break;
case IF_THEN_ELSE: printf("%*c条件语句(IF_THEN_ELSE):\n",indent,' ');
printf("%*c条件:\n",indent+3,' ');
display(T->ptr[0],indent+6); //显示条件
printf("%*cIF子句:\n",indent+3,' ');
display(T->ptr[1],indent+6); //显示if子句
printf("%*cELSE子句:\n",indent+3,' ');
display(T->ptr[2],indent+6); //显示else子句
break;
case DEF_LIST: display(T->ptr[0],indent); //显示该局部变量定义列表中的第一个
display(T->ptr[1],indent); //显示其它局部变量定义
break;
case VAR_DEF: printf("%*cLOCAL VAR_NAME:\n",indent,' ');
display(T->ptr[0],indent+3); //显示变量类型
display(T->ptr[1],indent+3); //显示该定义的全部变量名
break;
case DEC_LIST: printf("%*cVAR_NAME:\n",indent,' ');
T0=T;
while (T0) {
if (T0->ptr[0]->kind==ID)
printf("%*c %s\n",indent+3,' ',T0->ptr[0]->type_id);
else if (T0->ptr[0]->kind==ASSIGNOP)
{
printf("%*c %s ASSIGNOP\n ",indent+3,' ',T0->ptr[0]->ptr[0]->type_id);
//显示初始化表达式
display(T0->ptr[0]->ptr[1],indent+strlen(T0->ptr[0]->ptr[0]->type_id)+4);
}
T0=T0->ptr[1];
}
break;
case STRUCT_VAR: printf("%*c结构体成员:\n",indent,' ');
printf("%*c来自结构体变量:\n",indent,' ');
display(T->ptr[0],indent+3);
printf("%*c变量成员为:\n",indent+3,' ');
display(T->ptr[1],indent+3);
break;
case ARRAY_VAR: printf("%*c数组成员:\n",indent,' ');
printf("%*c数组名:%s\n",indent+3,' ',T->type_id);
printf("%*c下标:\n",indent+3,' ');
display(T->ptr[0],indent+3);
break;
case ID: printf("%*cID: %s\n",indent,' ',T->type_id);
break;
case INT: printf("%*cINT:%d\n",indent,' ',T->type_int);
break;
case FLOAT: printf("%*cFLAOT:%f\n",indent,' ',T->type_float);
break;
case CHAR: printf("%*cCHAR:%c\n",indent,' ',T->type_char);
break;
case STRING: printf("%*cSTRING:%s\n",indent,' ',T->type_string);
break;
case ASSIGNOP:
case AND:
case OR:
case RELOP:
case PLUS:
case MINUS:
case STAR:
case DIV:
printf("%*c%s\n",indent,' ',T->type_id);
display(T->ptr[0],indent+3);
display(T->ptr[1],indent+3);
break;
case INCREMENT: printf("%*c%s++\n",indent,' ',T->type_id);
break;
case DECREMENT: printf("%*c%s--\n",indent,' ',T->type_id);
break;
case NOT:
case UMINUS: printf("%*c%s\n",indent,' ',T->type_id);
display(T->ptr[0],indent+3);
break;
case FUNC_CALL: printf("%*c函数调用:\n",indent,' ');
printf("%*c函数名:%s\n",indent+3,' ',T->type_id);
display(T->ptr[0],indent+3);
break;
case ARGS: i=1;
while (T) { //ARGS表示实际参数表达式序列结点,其第一棵子树为其一个实际参数表达式,第二棵子树为剩下的。
struct node *T0=T->ptr[0];
printf("%*c第%d个实际参数表达式:\n",indent,' ',i++);
display(T0,indent+3);
T=T->ptr[1];
}
// printf("%*c第%d个实际参数表达式:\n",indent,' ',i);
// display(T,indent+3);
printf("\n");
break;
}
}
}