codeb: assigment auf eine schon vorhandene variable
authorBernhard Urban <lewurm@gmail.com>
Sat, 29 May 2010 20:31:45 +0000 (22:31 +0200)
committerBernhard Urban <lewurm@gmail.com>
Sat, 29 May 2010 20:31:45 +0000 (22:31 +0200)
codeb/parser.y

index 6c956447d4d44e7eddb93014a8957005c5a0b227..014175549e545ec4e86f746d890e0c2137e4df2d 100644 (file)
@@ -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);
                        }
                }