Skip to content

Commit 30a92d3

Browse files
authored
Merge pull request #16 from MisakaVan/dev
Feat: Better identifier handling
2 parents f2ca913 + a84e606 commit 30a92d3

File tree

7 files changed

+332
-2
lines changed

7 files changed

+332
-2
lines changed

readme.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
- [x] 有三个移入/规约冲突(关于 `annon-right-type` ) 这些冲突是因为这个标注类型可能为空导致的。
1111
- [ ] 利用 `lib.h` 给的哈希表存放一些类型前置定义
12-
- [ ] 检查在全局变量/Struct/Union/Enum/Typedef声明中出现的标识符是否已经在全局出现过
13-
- [ ] 检查Struct/Union/Enum/Typedef被使用时是否已经有前置定义
12+
- [x] 检查在全局变量/Struct/Union/Enum/Typedef声明中出现的标识符是否已经在全局出现过
13+
- [x] 检查Struct/Union/Enum/Typedef被使用时是否已经有前置定义
1414
- [ ] 检查Struct/Union的字段内是否有变量名重复
1515
- [ ] 完善build、test、使用文档
1616

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
struct Foo;
2+
3+
struct Foo a; // OK: Foo is registered as struct at line 1
4+
5+
enum Foo b; // Warning: Identifier Foo has been registered as struct, not enum
6+
7+
union Foo c; // Warning: Identifier Foo has been registered as struct, not union
8+
9+
10+
typedef Foo foo_t;
11+
foo_t d; // OK: foo_t has been registered as typedef
12+
bar_t e; // Warning: Identifier bar_t has never been registered
13+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// redefine a variable-registered identifier as other types
2+
3+
// some variables to be used in the test
4+
char var1;
5+
char var2;
6+
char var3;
7+
char var4;
8+
char var5;
9+
char var6;
10+
11+
// 1. redefine as a variable
12+
int var1; // Warning
13+
14+
// 2. redefine as an enumerator
15+
enum SomeEnum { var2 }; // Warning
16+
17+
// 3. redefine as a struct
18+
struct var3 { int a; }; // OK
19+
20+
// 4. redefine as a union
21+
union var4 { int a; }; // OK
22+
23+
// 5. redefine as an enum
24+
enum var5 { a, b, c }; // OK
25+
26+
// 6. redefine as a typedef
27+
typedef int var6; // Warning

src/lang.c

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "lang.h"
2+
#include "lib.h"
23
#include <stdio.h>
34
#include <stdlib.h>
45
#include <string.h>
@@ -78,13 +79,19 @@ struct enum_ele_list* TECons(char* name, struct enum_ele_list* next) {
7879
struct enum_ele_list* res = new_enum_ele_list_ptr();
7980
res->name = name;
8081
res->next = next;
82+
83+
register_identifier_enumerator(name);
84+
8185
return res;
8286
}
8387

8488
struct left_type* TStructType(char* name) {
8589
struct left_type* res = new_left_type_ptr();
8690
res->t = T_STRUCT_TYPE;
8791
res->d.STRUCT_TYPE.name = name;
92+
93+
check_identifier_struct(name);
94+
8895
return res;
8996
}
9097

@@ -93,13 +100,18 @@ struct left_type* TNewStructType(char* name, struct type_list* fld) {
93100
res->t = T_NEW_STRUCT_TYPE;
94101
res->d.NEW_STRUCT_TYPE.name = name;
95102
res->d.NEW_STRUCT_TYPE.fld = fld;
103+
104+
register_identifier_struct(name);
96105
return res;
97106
}
98107

99108
struct left_type* TUnionType(char* name) {
100109
struct left_type* res = new_left_type_ptr();
101110
res->t = T_UNION_TYPE;
102111
res->d.UNION_TYPE.name = name;
112+
113+
check_identifier_union(name);
114+
103115
return res;
104116
}
105117

@@ -108,13 +120,19 @@ struct left_type* TNewUnionType(char* name, struct type_list* fld) {
108120
res->t = T_NEW_UNION_TYPE;
109121
res->d.NEW_UNION_TYPE.name = name;
110122
res->d.NEW_UNION_TYPE.fld = fld;
123+
124+
register_identifier_union(name);
125+
111126
return res;
112127
}
113128

114129
struct left_type* TEnumType(char* name) {
115130
struct left_type* res = new_left_type_ptr();
116131
res->t = T_ENUM_TYPE;
117132
res->d.ENUM_TYPE.name = name;
133+
134+
check_identifier_enum(name);
135+
118136
return res;
119137
}
120138

@@ -123,6 +141,9 @@ struct left_type* TNewEnumType(char* name, struct enum_ele_list* ele) {
123141
res->t = T_NEW_ENUM_TYPE;
124142
res->d.NEW_ENUM_TYPE.name = name;
125143
res->d.NEW_ENUM_TYPE.ele = ele;
144+
145+
register_identifier_enum(name);
146+
126147
return res;
127148
}
128149

@@ -142,6 +163,9 @@ struct left_type* TDefinedType(char* name) {
142163
struct left_type* res = new_left_type_ptr();
143164
res->t = T_DEFINED_TYPE;
144165
res->d.DEFINED_TYPE.name = name;
166+
167+
check_identifier_typedef(name);
168+
145169
return res;
146170
}
147171

@@ -182,13 +206,19 @@ struct glob_item* TStructDef(char* name, struct type_list* fld) {
182206
res->t = T_STRUCT_DEF;
183207
res->d.STRUCT_DEF.name = name;
184208
res->d.STRUCT_DEF.fld = fld;
209+
210+
register_identifier_struct(name);
211+
185212
return res;
186213
}
187214

188215
struct glob_item* TStructDecl(char* name) {
189216
struct glob_item* res = new_glob_item_ptr();
190217
res->t = T_STRUCT_DECL;
191218
res->d.STRUCT_DECL.name = name;
219+
220+
register_identifier_struct(name);
221+
192222
return res;
193223
}
194224

@@ -197,13 +227,19 @@ struct glob_item* TUnionDef(char* name, struct type_list* fld) {
197227
res->t = T_UNION_DEF;
198228
res->d.UNION_DEF.name = name;
199229
res->d.UNION_DEF.fld = fld;
230+
231+
register_identifier_union(name);
232+
200233
return res;
201234
}
202235

203236
struct glob_item* TUnionDecl(char* name) {
204237
struct glob_item* res = new_glob_item_ptr();
205238
res->t = T_UNION_DECL;
206239
res->d.UNION_DECL.name = name;
240+
241+
register_identifier_union(name);
242+
207243
return res;
208244
}
209245

@@ -212,13 +248,19 @@ struct glob_item* TEnumDef(char* name, struct enum_ele_list* ele) {
212248
res->t = T_ENUM_DEF;
213249
res->d.ENUM_DEF.name = name;
214250
res->d.ENUM_DEF.ele = ele;
251+
252+
register_identifier_enum(name);
253+
215254
return res;
216255
}
217256

218257
struct glob_item* TEnumDecl(char* name) {
219258
struct glob_item* res = new_glob_item_ptr();
220259
res->t = T_ENUM_DECL;
221260
res->d.ENUM_DECL.name = name;
261+
262+
register_identifier_enum(name);
263+
222264
return res;
223265
}
224266

@@ -227,6 +269,26 @@ struct glob_item* TTypeDef(struct left_type* t, struct var_decl_expr* e) {
227269
res->t = T_TYPE_DEF;
228270
res->d.TYPE_DEF.t = t;
229271
res->d.TYPE_DEF.e = e;
272+
273+
// get the core type name and register it
274+
struct var_decl_expr* ptr = e;
275+
while (ptr->t != T_ORIG_TYPE) {
276+
switch (ptr->t) {
277+
case T_PTR_TYPE:
278+
ptr = ptr->d.PTR_TYPE.base;
279+
break;
280+
case T_ARRAY_TYPE:
281+
ptr = ptr->d.ARRAY_TYPE.base;
282+
break;
283+
case T_FUNC_TYPE:
284+
ptr = ptr->d.FUNC_TYPE.ret;
285+
break;
286+
case T_ORIG_TYPE:
287+
break;
288+
}
289+
}
290+
register_identifier_typedef(ptr->d.ORIG_TYPE.name);
291+
230292
return res;
231293
}
232294

@@ -235,6 +297,25 @@ struct glob_item* TVarDef(struct left_type* t, struct var_decl_expr* e) {
235297
res->t = T_VAR_DEF;
236298
res->d.VAR_DEF.t = t;
237299
res->d.VAR_DEF.e = e;
300+
301+
// get the core type name and register it
302+
struct var_decl_expr* ptr = e;
303+
while (ptr->t != T_ORIG_TYPE) {
304+
switch (ptr->t) {
305+
case T_PTR_TYPE:
306+
ptr = ptr->d.PTR_TYPE.base;
307+
break;
308+
case T_ARRAY_TYPE:
309+
ptr = ptr->d.ARRAY_TYPE.base;
310+
break;
311+
case T_FUNC_TYPE:
312+
ptr = ptr->d.FUNC_TYPE.ret;
313+
break;
314+
case T_ORIG_TYPE:
315+
break;
316+
}
317+
}
318+
register_identifier_variable(ptr->d.ORIG_TYPE.name);
238319
return res;
239320
}
240321

0 commit comments

Comments
 (0)