From ac0ffb00935e2b5920a256ce90e2910453391357 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Thu, 22 Apr 2010 15:09:17 +0200 Subject: [PATCH] ag: refactor fun --- ag/parser.y | 13 +++++++------ ag/symtable.c | 30 ++++++++++++++---------------- ag/symtable.h | 4 ++-- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/ag/parser.y b/ag/parser.y index d7cdf4a..dbd4e24 100644 --- a/ag/parser.y +++ b/ag/parser.y @@ -6,8 +6,7 @@ %} %start Input -%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS -%token IDENT NUM ASSIGN +%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN @macro xxputsin(xx,) @i xx = @Statement.sin@; @@ -32,7 +31,7 @@ Input: Program @{ - @i @Program.f@ = new_tab(); + @i @Program.f@ = tab_new(); @} ; @@ -73,7 +72,7 @@ Parms: | @{ - @i @Parms.f@ = new_tab(); + @i @Parms.f@ = tab_new(); @} ; @@ -85,7 +84,7 @@ FeldID: | @{ - @i @FeldID.f@ = new_tab(); + @i @FeldID.f@ = tab_new(); @} ; @@ -109,7 +108,9 @@ Statement: | VAR IDENT ASSIGN Expr @{ - @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1); + /* tab_clone ist hier noetig, vgl. folgendes statement + * > var x := x - 1; */ + @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1); xxputsin(@Expr.s@,) @} diff --git a/ag/symtable.c b/ag/symtable.c index 8c175e5..850c1b0 100755 --- a/ag/symtable.c +++ b/ag/symtable.c @@ -5,32 +5,29 @@ #define DD -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); @@ -54,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; } @@ -84,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) @@ -134,6 +130,8 @@ void check(struct symbol *tab, char *ident, short type) } } + /* 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); diff --git a/ag/symtable.h b/ag/symtable.h index 06aaffc..df7fa5a 100755 --- a/ag/symtable.h +++ b/ag/symtable.h @@ -12,8 +12,8 @@ struct symbol { short type; }; -struct symbol *clone_tab(struct symbol *tab); -struct symbol *new_tab(void); +struct symbol *tab_clone(struct symbol *tab); +struct symbol *tab_new(void); struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short check); struct symbol *tab_lookup(struct symbol *tab, char *ident, short type); struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type); -- 2.25.1