ag: even more refactored
authorBernhard Urban <lewurm@gmail.com>
Tue, 30 Mar 2010 12:46:10 +0000 (14:46 +0200)
committerBernhard Urban <lewurm@gmail.com>
Tue, 30 Mar 2010 12:46:10 +0000 (14:46 +0200)
ag/parser.y
ag/symtable.c

index 3d278fdd4619663ab50a3ce2f67ddf5052f055df..7eb49e888fe3ca39b5094fd32cd69b3cdb888bd8 100644 (file)
@@ -18,7 +18,7 @@
 @attributes    { struct symbol *symbols; } Funcdef Stats Bool Expr Call Lexpr Field Term Plusterm Malterm Bterm Orterm Exprs
 @attributes    { struct symbol *in_symbols; struct symbol *out_symbols; } Stat
 
-@traversal @postorder t
+@traversal @postorder c
 
 %%
 
@@ -29,12 +29,12 @@ Input:                Program
 
 Program:         Funcdef ';' Program
                @{
-                  @i @Program.fields@ = @Program.1.fields@;
+                  @i @Program.0.fields@ = @Program.1.fields@;
                @}
 
                | Structdef ';' Program
                @{
-                  @i @Program.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1);
+                  @i @Program.0.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1);
                   @i @Program.1.symbols@ = @Program.0.symbols@;
                @}
 
@@ -58,7 +58,7 @@ Structdef:      STRUCT Ids END
                ;  
 
 Ids:             ID Ids
-               @{ @i @Ids.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @}
+               @{ @i @Ids.0.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @}
 
                |
                @{ @i @Ids.fields@ = new_tab(); @}
@@ -66,7 +66,7 @@ Ids:            ID Ids
                ;
 
 Pars:            Pars ',' ID
-               @{ @i @Pars.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @}
+               @{ @i @Pars.0.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @}
 
                | ID
                @{ @i @Pars.pars@ = tab_add_symbol(new_tab(), @ID.name@, S_VAR, 0); @}
@@ -75,7 +75,7 @@ Pars:                   Pars ',' ID
  
 Stats:           Stat ';' Stats
                @{
-                  @i @Stat.in_symbols@ = @Stats.symbols@;
+                  @i @Stat.in_symbols@ = @Stats.0.symbols@;
                   @i @Stats.1.symbols@ = @Stat.out_symbols@;
                @}
 
@@ -105,7 +105,7 @@ Stat:                 VAR ID ASSIGN Expr
                | IF Bool THEN Stats ELSE Stats END
                @{
                   @i @Bool.symbols@ = @Stat.in_symbols@;
-                  @i @Stats.symbols@ = @Stat.in_symbols@;
+                  @i @Stats.0.symbols@ = @Stat.in_symbols@;
                   @i @Stats.1.symbols@ = @Stat.in_symbols@;
                   @i @Stat.out_symbols@ = @Stat.in_symbols@;
                @}
@@ -132,7 +132,7 @@ Stat:                 VAR ID ASSIGN Expr
                ;
  
 Lexpr:           ID
-               @{ @t check_variable(@Lexpr.symbols@, @ID.name@); @}
+               @{ @c check_variable(@Lexpr.symbols@, @ID.name@); @}
 
                | Field
                ;
@@ -153,7 +153,7 @@ Malterm:      '*' Term Malterm
  
 Term:            '(' Expr ')'
                | ID
-               @{ @t check_variable(@Term.symbols@, @ID.name@); @}
+               @{ @c check_variable(@Term.symbols@, @ID.name@); @}
 
                | NUM
                | Call
@@ -175,7 +175,7 @@ Bterm:                Term GREATER Term
                ;
 
 Field:           Term '.' ID
-               @{ @t check_field(@Field.symbols@, @ID.name@); @}
+               @{ @c check_field(@Field.symbols@, @ID.name@); @}
 
                ;
 
index 41957203a5bef66afcee1438ef9a5e533c31a4b2..7242f0684ebf51eefb9ba9fc2cda816114f3e73d 100755 (executable)
@@ -28,12 +28,13 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short
        struct symbol *elm;
        struct symbol *new_elm;
 
-       if(tab_lookup(tab,ident) != SYMNULL) {
+       if(tab_lookup(tab, ident) != SYMNULL) {
                if(check) {
                        fprintf(stderr, "Feld doppelt vorhanden: \"%s\"\n", ident);
                        exit(3);
+               } else {
+                       tab = tab_remove_symbol(tab, ident);
                }
-               tab = tab_remove_symbol(tab, ident);
        }
        
        new_elm = (struct symbol *) malloc(sizeof(struct symbol));
@@ -61,17 +62,13 @@ struct symbol *tab_lookup(struct symbol *tab, char *ident)
        if(tab == SYMNULL) {
                return SYMNULL;
        }
-       
-       if(strcmp(elm->ident, ident) == 0) {
-               return elm;
-       }
-       
-       while(elm->next != SYMNULL) {
-               elm = elm->next;
+
+       do {
                if(strcmp(elm->ident, ident) == 0) {
                        return elm;
                }
-       }
+               elm = elm->next;
+       } while(elm != SYMNULL);
 
        return SYMNULL;
 }
@@ -93,23 +90,17 @@ struct symbol *tab_remove_symbol(struct symbol *tab, char *ident)
 {
        struct symbol *elm = tab;
        struct symbol *previous_elm = SYMNULL;
-       struct symbol *new_elm;
-
-       if(tab == SYMNULL) {
-               return SYMNULL;
-       }
 
        while(elm != SYMNULL) {
                if(strcmp(elm->ident, ident) == 0) {
                        if(previous_elm == SYMNULL) {
-                               new_elm = elm->next;
+                               tab = elm->next;
                        } else {
                                previous_elm->next = elm->next;
-                               new_elm = tab;
                        }
                        (void)free(elm->ident);
                        (void)free(elm);
-                       return new_elm;
+                       break;
                }
                previous_elm = elm;
                elm = elm->next;