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
* > 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);
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
@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);
}
}