@attributes { struct symbol *f; int offsetcount; } FeldID
@attributes { struct symbol *s; } Methoddef
@attributes { struct symbol *s; int gparamges; } Exprs
-@attributes { struct symbol *s; int gparamges; int lblcnt_in; int lblcnt_out; } Statseq Elsestat
+@attributes { struct symbol *s; int gparamges; int lblcnt_in; int lblcnt_out; } Statseq
+@attributes { struct symbol *s; int gparamges; int lblcnt_in; int lblcnt_out; int reallblcnt; } Elsestat
@attributes { struct symbol *s; int gparamges; struct treenode *node; short imm; } Expr Minusterm Multerm Orterm Feld Term
@attributes { struct symbol *s; int gparamges; struct treenode *node; } Lexpr
@attributes { struct symbol *sin; int gparamges; struct symbol *sout; struct treenode *node; int vars; int lblcnt_in; int lblcnt_out; } Statement
| IF Expr THEN Statseq Elsestat END
@{
statinout()
- @i @Statseq.0.lblcnt_in@ = @Statement.lblcnt_in@ + 1;
- @i @Elsestat.lblcnt_in@ = @Statement.lblcnt_in@;
- /* TODO: welchen wert lblcnt_out zuweisen? :/ */
- @i @Statement.lblcnt_out@ = @Statseq.lblcnt_out@;
+ @i @Statseq.0.lblcnt_in@ = @Statement.lblcnt_in@ + 1;
+ @i @Elsestat.lblcnt_in@ = @Statseq.lblcnt_out@;
+ @i @Statement.lblcnt_out@ = @Elsestat.lblcnt_out@;
+
+ /* im Elsestat muss noch ein label numeriert werden */
+ @i @Elsestat.reallblcnt@ = @Statement.lblcnt_in@;
xxputsin(@Expr.s@,)
xxputsin(@Statseq.0.s@,)
Elsestat:
ELSE Statseq
@{
- @i @Statseq.lblcnt_in@ = @Elsestat.lblcnt_in@ + 1;
+ @i @Statseq.lblcnt_in@ = @Elsestat.lblcnt_in@;
@i @Elsestat.lblcnt_out@ = @Statseq.lblcnt_out@;
- @gen printf("\tjmp %s_ifend_%d\n%s_ifelse_%d:\n", get_func_name(), @Elsestat.lblcnt_in@, get_func_name(), @Elsestat.lblcnt_in@);
+ @gen printf("\tjmp %s_ifend_%d\n%s_ifelse_%d:\n", get_func_name(), @Elsestat.reallblcnt@, get_func_name(), @Elsestat.reallblcnt@);
@}
Lexpr: