4 #include "symbol_table.h"
6 struct symbol_t *new_table(void) {
7 return (struct symbol_t *)NULL;
10 struct symbol_t *clone_table(struct symbol_t *table) {
11 struct symbol_t *element;
12 struct symbol_t *new_tablex;
15 new_tablex=new_table();
16 while((struct symbol_t *)NULL!=element) {
17 /* check return value */
18 if(element->param_index!=-1) {
19 new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
22 new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
24 element=element->next;
30 struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
31 struct symbol_t *element;
32 struct symbol_t *new_element;
34 if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
36 fprintf(stderr,"Duplicate field %s.\n",identifier);
40 table=table_remove_symbol(table,identifier);
43 new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
44 new_element->next=(struct symbol_t *)NULL;
45 new_element->identifier=strdup(identifier);
46 new_element->type=type;
47 new_element->stack_offset=stack_offset;
48 new_element->param_index=-1;
50 if((struct symbol_t *)NULL==table) {
55 while((struct symbol_t *)NULL!=element->next) {
56 element=element->next;
59 element->next=new_element;
64 struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
65 struct symbol_t *element;
66 struct symbol_t *new_element;
68 if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
69 table=table_remove_symbol(table,identifier);
72 new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
73 new_element->next=(struct symbol_t *)NULL;
74 new_element->identifier=strdup(identifier);
75 new_element->type=SYMBOL_TYPE_PARAM;
76 new_element->param_index=param_index;
78 if((struct symbol_t *)NULL==table) {
83 while((struct symbol_t *)NULL!=element->next) {
84 element=element->next;
87 element->next=new_element;
92 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
93 struct symbol_t *element;
97 if((struct symbol_t *)NULL==table) {
98 return (struct symbol_t *)NULL;
101 if(strcmp(element->identifier,identifier)==0) {
105 while((struct symbol_t *)NULL!=element->next) {
106 element=element->next;
107 if(strcmp(element->identifier,identifier)==0) {
112 return (struct symbol_t *)NULL;
115 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
116 struct symbol_t *element;
117 struct symbol_t *new_table=clone_table(table);
120 while(element!=(struct symbol_t *)NULL) {
121 if(element->param_index!=-1) {
122 new_table=table_add_param(new_table,element->identifier,element->param_index);
125 new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
127 element=element->next;
133 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
134 struct symbol_t *element;
135 struct symbol_t *previous_element;
136 struct symbol_t *new_element;
138 if((struct symbol_t *)NULL==table) {
142 previous_element=(struct symbol_t *)NULL;
145 while((struct symbol_t *)NULL!=element) {
146 if(strcmp(element->identifier,identifier)==0) {
147 if((struct symbol_t *)NULL==previous_element) {
148 new_element=element->next;
151 previous_element->next=element->next;
154 (void)free(element->identifier);
158 previous_element=element;
159 element=element->next;
165 void check_variable(struct symbol_t *table, char *identifier) {
166 struct symbol_t *element=table_lookup(table,identifier);
167 if(element!=(struct symbol_t *)NULL) {
168 if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
169 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
174 fprintf(stderr,"Unknown identifier %s.\n",identifier);
179 void check_field(struct symbol_t *table, char *identifier) {
180 struct symbol_t *element=table_lookup(table,identifier);
181 if(element!=(struct symbol_t *)NULL) {
182 if(element->type!=SYMBOL_TYPE_FIELD) {
183 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
188 fprintf(stderr,"Unknown identifier %s.\n",identifier);