From e8d204f6cc7958e2d9711aa34bb879261b663431 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sat, 29 May 2010 22:19:15 +0200 Subject: [PATCH] codeb: var-assignments --- codeb/code.bfe | 7 ++++++- codeb/parser.y | 26 +++++++++++++++++++++----- codeb/tree.h | 4 ++-- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/codeb/code.bfe b/codeb/code.bfe index 7150830..86b6264 100644 --- a/codeb/code.bfe +++ b/codeb/code.bfe @@ -175,11 +175,16 @@ void gen_subspecial(struct treenode *bnode, short e) %} %start begin -%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 +%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 O_ASSIGN=16 %% begin: ret # 0 # printf("\n"); +begin: assign # 0 # + +assign: O_ASSIGN(O_ID, expr) # 1 # KIDREG2PARM(0); printf("\tmovq %%%s, %%%s\n", BN_REG, KID_REG(0)); +assign: O_ASSIGN(O_ID, O_ID) # 1 # KIDREG2PARM(0); KIDREG2PARM(1); printf("\tmovq %%%s, %%%s\n", KID_REG(1), KID_REG(0)); + ret: O_RET(retexpr) # 2 # printf("\t//o_ret(expr)\n"); move(BN_REG, "rax"); func_footer(); retexpr: O_ID # 1 # printf("\t//retexpr\n"); if(bnode->param_index > -1) move(param_reg(bnode->param_index), BN_REG); diff --git a/codeb/parser.y b/codeb/parser.y index 9a08dcc..6c95644 100644 --- a/codeb/parser.y +++ b/codeb/parser.y @@ -44,7 +44,8 @@ @attributes { struct symbol *s; int gparamges; } Statseq Exprs @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; } Statement +@attributes { struct symbol *sin; int gparamges; struct symbol *sout; struct +treenode *node; int vars; } Statement @traversal @postorder c @traversal @preorder reg @@ -125,7 +126,7 @@ Statseq: @{ @i @Statement.sin@ = @Statseq.0.s@; @i @Statseq.1.s@ = @Statement.sout@; - @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); + @i @Statseq.1.gparamges@ = @Statseq.0.gparamges@ + @Statement.vars@; @} | @@ -138,15 +139,21 @@ Statement: xxputsin(@Lexpr.s@,) xxputsin(@Expr.s@,) @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 0; @} | VAR IDENT ASSIGN Expr @{ /* tab_clone ist hier noetig, vgl. folgendes statement * > var x := x - 1; */ - @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, -1, -1); + @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, @Statement.gparamges@, -1); xxputsin(@Expr.s@,) - @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 1; + + @i @Statement.node@ = new_node(O_ASSIGN, new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, @Statement.gparamges@), @Expr.node@); + @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); @} | Expr @@ -154,6 +161,7 @@ Statement: statinout() xxputsin(@Expr.s@,) @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 0; @} | IF Expr THEN Statseq END @@ -162,6 +170,7 @@ Statement: xxputsin(@Expr.s@,) xxputsin(@Statseq.s@,) @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 0; @} | IF Expr THEN Statseq ELSE Statseq END @@ -171,6 +180,7 @@ Statement: xxputsin(@Statseq.0.s@,) xxputsin(@Statseq.1.s@,) @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 0; @} | WHILE Expr DO Statseq END @@ -179,14 +189,18 @@ Statement: xxputsin(@Expr.s@,) xxputsin(@Statseq.s@,) @i @Statement.node@ = TREENULL; + @i @Statement.vars@ = 0; @} | RETURN Expr @{ statinout() xxputsin(@Expr.s@,) + @i @Statement.vars@ = 0; @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL); @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); @} ; @@ -391,7 +405,9 @@ Term: /* es handelt sich um ein feldzugriff auf this */ @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 */ - @Term.node@ = new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index); + 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); } } diff --git a/codeb/tree.h b/codeb/tree.h index 24f1a3a..8975cc1 100644 --- a/codeb/tree.h +++ b/codeb/tree.h @@ -13,14 +13,14 @@ enum { O_RET=1, O_NULL, O_SUB, O_MUL, O_OR=5, O_LESS, O_EQ, O_ID, O_ADD, O_NUM=10, O_FIELD, O_MTWO, O_MFOUR, O_MEIGHT, - O_MONE=15 + O_MONE=15, O_ASSIGN }; static char *o_names[] = { "", "O_RET", "O_NULL", "O_SUB", "O_MUL", "O_OR", "O_LESS", "O_EQ", "O_ID", "O_ADD", "O_NUM", "O_FIELD", "O_MTWO", "O_MFOUR", "O_MEIGHT", - "O_MONE" + "O_MONE", "O_ASSIGN" }; struct treenode { -- 2.25.1