arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / ag / symtable.c
index 590077d71cfc8321bdeca31b56eb9d265093b8dd..850c1b08388b9252a5dac9f54ee674c0f256bf11 100755 (executable)
@@ -5,34 +5,29 @@
 
 #define DD
 
-static void check_gen(struct symbol *tab, char *ident, short type);
-
-struct symbol *new_tab(void)
+struct symbol *tab_new(void)
 {
        return SYMNULL;
 }
 
-struct symbol *clone_tab(struct symbol *tab)
+struct symbol *tab_clone(struct symbol *tab)
 {
-       struct symbol *elm;
-       struct symbol *new_tabx;
+       struct symbol *elm = tab;
+       struct symbol *ntab = tab_new();
 #ifdef DD
-       printf("clone_tab: tab(%08X)\n", tab);
+       printf("tab_clone: tab(%08X)\n", tab);
 #endif
 
-       elm = tab;
-       new_tabx = new_tab();
        while(elm != SYMNULL) {
-               new_tabx = tab_add_symbol(new_tabx, elm->ident, elm->type, 0);
+               ntab = tab_add_symbol(ntab, elm->ident, elm->type, 0);
                elm = elm->next;
        }
-
-       return new_tabx;
+       return ntab;
 }
 
 struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short check)
 {
-       struct symbol *elm;
+       struct symbol *elm = tab;
        struct symbol *new_elm;
 #ifdef DD
        printf("tab_add_symbol: tab(%08X), ident(%s), type(%i), check(%i)\n", tab, ident, type, check);
@@ -56,7 +51,6 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short
                return new_elm;
        }
 
-       elm = tab;
        while(elm->next != SYMNULL) {
                elm = elm->next;
        }
@@ -86,17 +80,17 @@ struct symbol *tab_lookup(struct symbol *tab, char *ident, short type)
 struct symbol *tab_merge(struct symbol *tab, struct symbol *to_add, short check)
 {
        struct symbol *elm = to_add;
-       struct symbol *new_tab = clone_tab(tab);
+       struct symbol *ntab = tab_clone(tab);
 #ifdef DD
-       printf("tab_merge: tab(%08X), to_add(%08X), check(%i), new_tab(%08X)\n", tab, to_add, check, new_tab);
+       printf("tab_merge: tab(%08X), to_add(%08X), check(%i), ntab(%08X)\n", tab, to_add, check, ntab);
 #endif
        
        while(elm != SYMNULL) {
-               new_tab = tab_add_symbol(new_tab, elm->ident, elm->type, check);
+               ntab = tab_add_symbol(ntab, elm->ident, elm->type, check);
                elm = elm->next;
        }
 
-       return new_tab;
+       return ntab;
 }
 
 struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type)
@@ -122,22 +116,23 @@ struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type)
        return tab;
 }
 
-void check_variable(struct symbol *tab, char *ident)
-{
-       check_gen(tab, ident, S_VAR);
-}
-
-void check_field(struct symbol *tab, char *ident)
+void check(struct symbol *tab, char *ident, short type)
 {
-       check_gen(tab, ident, S_FIELD);
-}
-
-static void check_gen(struct symbol *tab, char *ident, short type)
-{
-       struct symbol *elm = tab_lookup(tab, ident, type);
+       struct symbol *elm;
 #ifdef DD
-       printf("check_variable: tab(%08X), ident(%s), type(%i), elm(%08X)\n", tab, ident, type, elm);
+       printf("check: tab(%08X), ident(%s), type(%i), elm(%08X)\n", tab, ident, type, elm);
 #endif
+
+       if(type == S_VAR) {
+               elm = tab_lookup(tab, ident, type);
+               if(elm != SYMNULL) {
+                       return;
+               }
+       }
+
+       /* keine passende variable gefunden?
+        * => vllt gibt es ja ein passenden feldnamen */
+       elm = tab_lookup(tab, ident, S_FIELD);
        if(elm == SYMNULL) {
                fprintf(stderr, "Unbekannter Identifier: \"%s\"\n", ident);
                exit(3);