From 8fda85129bc4f0aaf59823492421c00d4bb5b3c9 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 30 May 2010 00:19:04 +0200 Subject: [PATCH] codeb: WHILE --- codeb/parser.y | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/codeb/parser.y b/codeb/parser.y index 7e354ce..49602fc 100644 --- a/codeb/parser.y +++ b/codeb/parser.y @@ -197,6 +197,7 @@ Statement: @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); @gen { + printf("%s_ifstart_%d:\n", get_func_name(), @Statement.lblcnt_in@); write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); /* TODO: kann ich mir das test wirklich wegan and davor sparen? */ printf("\ttest %s1, %%rax\n\tjz %s_ifend_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); @@ -223,6 +224,7 @@ Statement: @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); @gen { + printf("%s_ifstart_%d:\n", get_func_name(), @Statement.lblcnt_in@); write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); /* TODO: kann ich mir das test wirklich wegan and davor sparen? */ printf("\ttest %s1, %%rax\n\tjz %s_ifelse_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); @@ -233,13 +235,22 @@ Statement: | WHILE Expr DO Statseq END @{ statinout() - lblcountinout() - /* TODO */ - @i @Statseq.0.lblcnt_in@ = @Statement.lblcnt_in@ + 1; + @i @Statseq.lblcnt_in@ = @Statement.lblcnt_in@ + 1; + @i @Statement.lblcnt_out@ = @Statseq.lblcnt_out@; xxputsin(@Expr.s@,) xxputsin(@Statseq.s@,) - @i @Statement.node@ = TREENULL; + + @i @Statement.node@ = new_node(O_IF, @Expr.node@, TREENULL); @i @Statement.vars@ = 0; + + @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); + @gen { + printf("%s_whilestart_%d:\n", get_func_name(), @Statement.lblcnt_in@); + write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); + /* TODO: kann ich mir das test wirklich wegan and davor sparen? */ + printf("\ttest %s1, %%rax\n\tjz %s_whileend_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); + } + @gen @revorder(1) printf("\tjmp %s_whilestart_%d\n%s_whileend_%d:\n", get_func_name(), @Statement.lblcnt_in@, get_func_name(), @Statement.lblcnt_in@); @} | RETURN Expr -- 2.25.1