From c97419f3bacbfb2a50b9fe1b57cf500d1c00018f Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 30 Mar 2010 14:46:10 +0200 Subject: [PATCH] ag: even more refactored --- ag/parser.y | 20 ++++++++++---------- ag/symtable.c | 27 +++++++++------------------ 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/ag/parser.y b/ag/parser.y index 3d278fd..7eb49e8 100644 --- a/ag/parser.y +++ b/ag/parser.y @@ -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@); @} ; diff --git a/ag/symtable.c b/ag/symtable.c index 4195720..7242f06 100755 --- a/ag/symtable.c +++ b/ag/symtable.c @@ -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; -- 2.25.1