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 new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
19 element=element->next;
25 struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
26 struct symbol_t *element;
27 struct symbol_t *new_element;
29 if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
31 fprintf(stderr,"Duplicate field %s.\n",identifier);
35 table=table_remove_symbol(table,identifier);
38 new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
39 new_element->next=(struct symbol_t *)NULL;
40 new_element->identifier=strdup(identifier);
41 new_element->type=type;
42 new_element->stack_offset=stack_offset;
43 new_element->param_index=-1;
45 if((struct symbol_t *)NULL==table) {
50 while((struct symbol_t *)NULL!=element->next) {
51 element=element->next;
54 element->next=new_element;
59 struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
60 struct symbol_t *element;
61 struct symbol_t *new_element;
63 if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
64 table=table_remove_symbol(table,identifier);
67 new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
68 new_element->next=(struct symbol_t *)NULL;
69 new_element->identifier=strdup(identifier);
70 new_element->type=SYMBOL_TYPE_PARAM;
71 new_element->param_index=param_index;
73 if((struct symbol_t *)NULL==table) {
78 while((struct symbol_t *)NULL!=element->next) {
79 element=element->next;
82 element->next=new_element;
87 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
88 struct symbol_t *element;
92 if((struct symbol_t *)NULL==table) {
93 return (struct symbol_t *)NULL;
96 if(strcmp(element->identifier,identifier)==0) {
100 while((struct symbol_t *)NULL!=element->next) {
101 element=element->next;
102 if(strcmp(element->identifier,identifier)==0) {
107 return (struct symbol_t *)NULL;
110 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
111 struct symbol_t *element;
112 struct symbol_t *new_table=clone_table(table);
115 while(element!=(struct symbol_t *)NULL) {
116 if(element->param_index!=-1) {
117 new_table=table_add_param(new_table,element->identifier,element->param_index);
120 new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
122 element=element->next;
128 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
129 struct symbol_t *element;
130 struct symbol_t *previous_element;
131 struct symbol_t *new_element;
133 if((struct symbol_t *)NULL==table) {
137 previous_element=(struct symbol_t *)NULL;
140 while((struct symbol_t *)NULL!=element) {
141 if(strcmp(element->identifier,identifier)==0) {
142 if((struct symbol_t *)NULL==previous_element) {
143 new_element=element->next;
146 previous_element->next=element->next;
149 (void)free(element->identifier);
153 previous_element=element;
154 element=element->next;
160 void check_variable(struct symbol_t *table, char *identifier) {
161 struct symbol_t *element=table_lookup(table,identifier);
162 if(element!=(struct symbol_t *)NULL) {
163 if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
164 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
169 fprintf(stderr,"Unknown identifier %s.\n",identifier);
174 void check_field(struct symbol_t *table, char *identifier) {
175 struct symbol_t *element=table_lookup(table,identifier);
176 if(element!=(struct symbol_t *)NULL) {
177 if(element->type!=SYMBOL_TYPE_FIELD) {
178 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
183 fprintf(stderr,"Unknown identifier %s.\n",identifier);