From 8f0f30c33a2ea0daea6ebba23c6faac85615729a Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sat, 29 May 2010 22:31:45 +0200 Subject: [PATCH] codeb: assigment auf eine schon vorhandene variable --- codeb/parser.y | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/codeb/parser.y b/codeb/parser.y index 6c95644..0141755 100644 --- a/codeb/parser.y +++ b/codeb/parser.y @@ -138,8 +138,11 @@ Statement: statinout() xxputsin(@Lexpr.s@,) xxputsin(@Expr.s@,) - @i @Statement.node@ = TREENULL; + @i @Statement.node@ = new_node(O_ASSIGN, @Lexpr.node@, @Expr.node@); @i @Statement.vars@ = 0; + @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); + + @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); @} | VAR IDENT ASSIGN Expr @@ -148,9 +151,9 @@ Statement: * > var x := x - 1; */ @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, @Statement.gparamges@, -1); xxputsin(@Expr.s@,) - @i @Statement.vars@ = 1; @i @Statement.node@ = new_node(O_ASSIGN, new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, @Statement.gparamges@), @Expr.node@); + @i @Statement.vars@ = 1; @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); @@ -207,10 +210,24 @@ Statement: Lexpr: IDENT @{ - @i @Lexpr.node@ = TREENULL; @c check(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM); - /* this.feldname */ - /* TODO fuer zuweisungen ... (codeb?) */ + + /* TODO: selbe Code wie bei Term/IDENT -- schoener machen! */ + @i { + @Lexpr.node@ = TREENULL; + if(tab_lookup(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM) == SYMNULL) { + /* es handelt sich um ein feldzugriff auf this */ + @Lexpr.node@ = new_field(@IDENT.name@, new_param(O_ID, strdup("this"), TREENULL, TREENULL, 0), TREENULL, tab_lookup(@Lexpr.s@, @IDENT.name@, S_FIELD) == SYMNULL ? -1 : tab_lookup(@Lexpr.s@, @IDENT.name@, S_FIELD)->soffset); + } else { /* param oder var */ + int tmp = tab_lookup(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM) == SYMNULL ? -1 : tab_lookup(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM)->param_index; + @Lexpr.node@ = new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, tmp); + } + } + + @reg if(tab_lookup(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM) == SYMNULL) { + /* TODO: kein schoener hack? */ + @Lexpr.node@->kids[0]->reg = @Lexpr.node@->reg; + } @} | Feld @@ -406,7 +423,6 @@ Term: @Term.node@ = new_field(@IDENT.name@, new_param(O_ID, strdup("this"), TREENULL, TREENULL, 0), TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_FIELD) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_FIELD)->soffset); } else { /* param oder var */ int tmp = tab_lookup(@Term.s@, @IDENT.name@, S_VAR|S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_VAR|S_PARM)->param_index; - fprintf(stderr, "WTF: %d\n", tmp); @Term.node@ = new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, tmp); } } -- 2.25.1