X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=codeb%2Fparser.y;h=39cc35dbe86ea521fc84c18bcccc679ba47ae200;hb=7b8df533cad8c9a84e4da9b60f26b5109daef638;hp=6512c0cad1010953d82c9e7df8f6ced06394b678;hpb=92c27ac47e1391e06463ec3e383326267bb89465;p=uebersetzerbau-ss10.git diff --git a/codeb/parser.y b/codeb/parser.y index 6512c0c..39cc35d 100644 --- a/codeb/parser.y +++ b/codeb/parser.y @@ -198,12 +198,12 @@ 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@); + 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 %s-1, %%rax\n\tjz %s_ifend_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); + printf("\tjz .%s_ifend_%d\n", get_func_name(), @Statement.lblcnt_in@); } - @gen @revorder(1) printf("%s_ifend_%d:\n", get_func_name(), @Statement.lblcnt_in@); + @gen @revorder(1) printf(".%s_ifend_%d:\n", get_func_name(), @Statement.lblcnt_in@); @} | IF Expr THEN Statseq Elsestat END @@ -225,12 +225,12 @@ 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@); + 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 %s-1, %%rax\n\tjz %s_ifelse_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); + printf("\tjz .%s_ifelse_%d\n", get_func_name(), @Statement.lblcnt_in@); } - @gen @revorder(1) printf("%s_ifend_%d:\n", get_func_name(), @Statement.lblcnt_in@); + @gen @revorder(1) printf(".%s_ifend_%d:\n", get_func_name(), @Statement.lblcnt_in@); @} | WHILE Expr DO Statseq END @@ -246,12 +246,12 @@ Statement: @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@); + 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 %s-1, %%rax\n\tjz %s_whileend_%d\n", "$", get_func_name(), @Statement.lblcnt_in@); + printf("\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@); + @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 @@ -274,7 +274,7 @@ Elsestat: @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.reallblcnt@, get_func_name(), @Elsestat.reallblcnt@); + @gen printf("\tjmp .%s_ifend_%d\n.%s_ifelse_%d:\n", get_func_name(), @Elsestat.reallblcnt@, get_func_name(), @Elsestat.reallblcnt@); @} Lexpr: @@ -320,9 +320,9 @@ Expr: | NOT Term @{ - @i @Expr.node@ = new_node(O_EQ, @Term.node@, new_node(O_NULL, TREENULL, TREENULL)); + @i @Expr.node@ = new_node(O_BOOL, new_node(O_EQ, @Term.node@, new_node(O_NULL, TREENULL, TREENULL)), TREENULL); - @reg @Term.node@->reg = @Expr.node@->reg; + @reg @Term.node@->reg = @Expr.node@->kids[0]->reg = @Expr.node@->reg; @} | Term Minusterm @@ -370,22 +370,22 @@ Expr: | Term '<' Term @{ - @i @Expr.node@ = new_node(O_LESS, @Term.0.node@, @Term.1.node@); + @i @Expr.node@ = new_node(O_BOOL, new_node(O_LESS, @Term.0.node@, @Term.1.node@), TREENULL); @i @Expr.imm@ = @Term.0.imm@ && @Term.0.imm@; @reg { - @Term.0.node@->reg = @Expr.node@->reg; + @Term.0.node@->reg = @Expr.node@->kids[0]->reg = @Expr.node@->reg; @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.gparamges@); } @} | Term '=' Term @{ - @i @Expr.node@ = new_node(O_EQ, @Term.0.node@, @Term.1.node@); + @i @Expr.node@ = new_node(O_BOOL, new_node(O_EQ, @Term.0.node@, @Term.1.node@), TREENULL); @i @Expr.imm@ = @Term.0.imm@ && @Term.0.imm@; @reg { - @Term.0.node@->reg = @Expr.node@->reg; + @Term.0.node@->reg = @Expr.node@->kids[0]->reg = @Expr.node@->reg; @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.gparamges@); } @}