ag: noch ein paar bugs gefixt und symboltaballe weiter verschoenert
authorBernhard Urban <lewurm@gmail.com>
Tue, 30 Mar 2010 17:20:46 +0000 (19:20 +0200)
committerBernhard Urban <lewurm@gmail.com>
Tue, 30 Mar 2010 17:23:11 +0000 (19:23 +0200)
ag/parser.y
ag/symtable.c
ag/symtable.h

index af8f0a68ff0a4ee9e145036a2b2641ce9ee295c4..b678961c091c53a8a3eabf609b9484655dbb411b 100644 (file)
@@ -115,7 +115,7 @@ Statement:
 
        | VAR IDENT ASSIGN Expr
          @{
-               @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 0);
+               @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
                @i @Expr.s@ = @Statement.sin@;
          @}
 
index 7242f0684ebf51eefb9ba9fc2cda816114f3e73d..590077d71cfc8321bdeca31b56eb9d265093b8dd 100755 (executable)
@@ -3,6 +3,10 @@
 #include <stdio.h>
 #include "symtable.h"
 
+#define DD
+
+static void check_gen(struct symbol *tab, char *ident, short type);
+
 struct symbol *new_tab(void)
 {
        return SYMNULL;
@@ -12,6 +16,9 @@ struct symbol *clone_tab(struct symbol *tab)
 {
        struct symbol *elm;
        struct symbol *new_tabx;
+#ifdef DD
+       printf("clone_tab: tab(%08X)\n", tab);
+#endif
 
        elm = tab;
        new_tabx = new_tab();
@@ -27,13 +34,16 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short
 {
        struct symbol *elm;
        struct symbol *new_elm;
+#ifdef DD
+       printf("tab_add_symbol: tab(%08X), ident(%s), type(%i), check(%i)\n", tab, ident, type, check);
+#endif
 
-       if(tab_lookup(tab, ident) != SYMNULL) {
+       if(tab_lookup(tab, ident, type) != SYMNULL) {
                if(check) {
-                       fprintf(stderr, "Feld doppelt vorhanden: \"%s\"\n", ident);
+                       fprintf(stderr, "Identifier doppelt vorhanden: \"%s\"\n", ident);
                        exit(3);
                } else {
-                       tab = tab_remove_symbol(tab, ident);
+                       tab = tab_remove_symbol(tab, ident, type);
                }
        }
        
@@ -55,7 +65,7 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short
        return tab;
 }
 
-struct symbol *tab_lookup(struct symbol *tab, char *ident)
+struct symbol *tab_lookup(struct symbol *tab, char *ident, short type)
 {
        struct symbol *elm = tab;
 
@@ -64,7 +74,7 @@ struct symbol *tab_lookup(struct symbol *tab, char *ident)
        }
 
        do {
-               if(strcmp(elm->ident, ident) == 0) {
+               if((elm->type == type) && (strcmp(elm->ident, ident) == 0)) {
                        return elm;
                }
                elm = elm->next;
@@ -77,6 +87,9 @@ 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);
+#ifdef DD
+       printf("tab_merge: tab(%08X), to_add(%08X), check(%i), new_tab(%08X)\n", tab, to_add, check, new_tab);
+#endif
        
        while(elm != SYMNULL) {
                new_tab = tab_add_symbol(new_tab, elm->ident, elm->type, check);
@@ -86,13 +99,13 @@ struct symbol *tab_merge(struct symbol *tab, struct symbol *to_add, short check)
        return new_tab;
 }
 
-struct symbol *tab_remove_symbol(struct symbol *tab, char *ident)
+struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type)
 {
        struct symbol *elm = tab;
        struct symbol *previous_elm = SYMNULL;
 
        while(elm != SYMNULL) {
-               if(strcmp(elm->ident, ident) == 0) {
+               if((elm->type == type) && (strcmp(elm->ident, ident) == 0)) {
                        if(previous_elm == SYMNULL) {
                                tab = elm->next;
                        } else {
@@ -111,27 +124,21 @@ struct symbol *tab_remove_symbol(struct symbol *tab, char *ident)
 
 void check_variable(struct symbol *tab, char *ident)
 {
-       struct symbol *elm = tab_lookup(tab, ident);
-       if(elm != SYMNULL) {
-               if(elm->type != S_VAR) {
-                       fprintf(stderr, "Identifier ist keine Variable: \"%s\"\n", ident);
-                       exit(3);
-               }
-       } else {
-               fprintf(stderr, "Unbekannter Identifier: \"%s\"\n", ident);
-               exit(3);
-       }
+       check_gen(tab, ident, S_VAR);
 }
 
 void check_field(struct symbol *tab, char *ident)
 {
-       struct symbol *elm = tab_lookup(tab, ident);
-       if(elm != SYMNULL) {
-               if(elm->type != S_FIELD) {
-                       fprintf(stderr, "Identifier ist kein Feld: \"%s\"\n", ident);
-                       exit(3);
-               }
-       } else {
+       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);
+#ifdef DD
+       printf("check_variable: tab(%08X), ident(%s), type(%i), elm(%08X)\n", tab, ident, type, elm);
+#endif
+       if(elm == SYMNULL) {
                fprintf(stderr, "Unbekannter Identifier: \"%s\"\n", ident);
                exit(3);
        }
index 92bfc8625f197bd93a518c75c5222c49da36e5ea..4897a744277aba5b8a411e52a7f12c9554234c38 100755 (executable)
@@ -15,8 +15,8 @@ struct symbol {
 struct symbol *clone_tab(struct symbol *tab);
 struct symbol *new_tab(void);
 struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short check);
-struct symbol *tab_lookup(struct symbol *tab, char *ident);
-struct symbol *tab_remove_symbol(struct symbol *tab, char *ident);
+struct symbol *tab_lookup(struct symbol *tab, char *ident, short type);
+struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type);
 struct symbol *tab_merge(struct symbol *tab, struct symbol *to_add, short check);
 void check_variable(struct symbol *tab, char *ident);
 void check_field(struct symbol *tab, char *ident);