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
8488struct 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
99108struct 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
114129struct 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
188215struct 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
203236struct 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
218257struct 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