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;
44 if((struct symbol_t *)NULL==table) {
49 while((struct symbol_t *)NULL!=element->next) {
50 element=element->next;
53 element->next=new_element;
58 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
59 struct symbol_t *element;
63 if((struct symbol_t *)NULL==table) {
64 return (struct symbol_t *)NULL;
67 if(strcmp(element->identifier,identifier)==0) {
71 while((struct symbol_t *)NULL!=element->next) {
72 element=element->next;
73 if(strcmp(element->identifier,identifier)==0) {
78 return (struct symbol_t *)NULL;
81 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
82 struct symbol_t *element;
83 struct symbol_t *new_table=clone_table(table);
86 while(element!=(struct symbol_t *)NULL) {
87 printf("%s\n",element->identifier);
88 new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
89 element=element->next;
95 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
96 struct symbol_t *element;
97 struct symbol_t *previous_element;
98 struct symbol_t *new_element;
100 if((struct symbol_t *)NULL==table) {
104 previous_element=(struct symbol_t *)NULL;
107 while((struct symbol_t *)NULL!=element) {
108 if(strcmp(element->identifier,identifier)==0) {
109 if((struct symbol_t *)NULL==previous_element) {
110 new_element=element->next;
113 previous_element->next=element->next;
116 (void)free(element->identifier);
120 previous_element=element;
121 element=element->next;
127 void check_variable(struct symbol_t *table, char *identifier) {
128 struct symbol_t *element=table_lookup(table,identifier);
129 if(element!=(struct symbol_t *)NULL) {
130 if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
131 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
136 fprintf(stderr,"Unknown identifier %s.\n",identifier);
141 void check_field(struct symbol_t *table, char *identifier) {
142 struct symbol_t *element=table_lookup(table,identifier);
143 if(element!=(struct symbol_t *)NULL) {
144 if(element->type!=SYMBOL_TYPE_FIELD) {
145 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
150 fprintf(stderr,"Unknown identifier %s.\n",identifier);