From 146f7d2d6955e2a436bbd33e9bd4126776451103 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 4 May 2010 13:25:46 +0200 Subject: [PATCH] codea: exprcount (funktioniert vllt noch nicht richtig) --- codea/parser.y | 31 ++++++++++++++++++++++--------- codea/tree.c | 14 ++++++++------ codea/tree.h | 7 ++++--- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/codea/parser.y b/codea/parser.y index 15b2424..e5a7dd2 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -22,14 +22,14 @@ @end @autoinh s -@autosyn node imm +@autosyn node imm exprcount @attributes { char *name; } IDENT @attributes { long val; } NUM @attributes { struct symbol *f; int parms; } Parms @attributes { struct symbol *f; } FeldID Structdef Program @attributes { struct symbol *s; } Methoddef Statseq Exprs -@attributes { struct symbol *s; struct treenode *node; short imm; } Expr Minusterm Term +@attributes { struct symbol *s; struct treenode *node; short imm; int exprcount; } Expr Minusterm Term @attributes { struct symbol *s; struct treenode *node; } Lexpr Multerm Orterm Feld @attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement @@ -167,7 +167,7 @@ Statement: @{ statinout() xxputsin(@Expr.s@,) - @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL); + @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL, 0); @reg @Statement.node@->reg = next_reg((char *)NULL, 0); @Expr.node@->reg = @Statement.node@->reg; @} ; @@ -202,7 +202,8 @@ Expr: | Term Minusterm @{ - @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@); + @i @Expr.exprcount@ = @Term.exprcount@ + @Minusterm.exprcount@; + @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@, @Expr.exprcount@); @i @Expr.imm@ = @Term.imm@ && @Minusterm.imm@; @reg { @@ -228,19 +229,22 @@ Expr: @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; + /* das is bloedsinn atm */ @i @Expr.exprcount@ = 0; @} | Term '=' Term @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; + /* das is bloedsinn atm */ @i @Expr.exprcount@ = 0; @} ; Minusterm: '-' Term Minusterm @{ - @i @Minusterm.node@ = new_node(O_ADD, @Minusterm.1.node@, @Term.node@); + @i @Minusterm.0.exprcount@ = @Term.exprcount@ + @Minusterm.1.exprcount@; + @i @Minusterm.node@ = new_node(O_ADD, @Minusterm.1.node@, @Term.node@, @Minusterm.0.exprcount@); @i @Minusterm.imm@ = @Term.imm@ && @Minusterm.1.imm@; @reg { @@ -251,6 +255,7 @@ Minusterm: | '-' Term @{ + @i @Minusterm.exprcount@ = @Term.exprcount@; @reg @Term.node@->reg = @Minusterm.node@->reg; @} ; @@ -283,30 +288,35 @@ Term: '(' Expr ')' @{ @i @Term.node@ = @Expr.node@; + @i @Term.exprcount@ = @Expr.exprcount@ + 1; @} | NUM @{ - @i @Term.node@ = new_number(@NUM.val@); + @i @Term.exprcount@ = 1; + @i @Term.node@ = new_number(@NUM.val@, @Term.exprcount@); @i @Term.imm@ = 1; @} | '-' NUM @{ - @i @Term.node@ = new_number(-1 * (@NUM.val@)); + @i @Term.exprcount@ = 1; + @i @Term.node@ = new_number(-1 * (@NUM.val@), @Term.exprcount@); @i @Term.imm@ = 1; @} | THIS @{ - @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, 0); + @i @Term.exprcount@ = 1; + @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, 0, @Term.exprcount@); @i @Term.imm@ = 0; @} | IDENT @{ @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM); - @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index); + @i @Term.exprcount@ = 1; + @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index, @Term.exprcount@); @i @Term.imm@ = 0; @} @@ -314,18 +324,21 @@ Term: @{ @i @Term.node@ = TREENULL; @i @Term.imm@ = 0; + /*TODO*/@i @Term.exprcount@ = 1; @} | IDENT '(' Exprs ')' @{ @i @Term.node@ = TREENULL; @i @Term.imm@ = 0; + /*TODO*/@i @Term.exprcount@ = 1; @} | Term '.' IDENT '(' Exprs ')' @{ @i @Term.node@ = TREENULL; @i @Term.imm@ = 0; + /*TODO*/@i @Term.exprcount@ = 1; @} ; diff --git a/codea/tree.c b/codea/tree.c index e480fa7..19d750c 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -14,12 +14,12 @@ static struct treenode *_new_plain(int op) new->parent = TREENULL; new->label = NULL; new->name = new->reg = (char *)NULL; - new->val = new->skip = 0; + new->val = new->skip = new->exprcount = 0; new->param_index = -1; return new; } -struct treenode *new_node(int op, struct treenode *l, struct treenode *r) +struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount) { struct treenode *new = _new_plain(op); @@ -30,12 +30,13 @@ struct treenode *new_node(int op, struct treenode *l, struct treenode *r) new->kids[0] = l; new->kids[1] = r; new->name = (char *)NULL; + new->exprcount = exprcount; return new; } -struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index) +struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index, int exprcount) { - struct treenode *new = new_node(op, l, r); + struct treenode *new = new_node(op, l, r, exprcount); #ifdef DDTREE fprintf(stderr, "new_param: %i (index)\n", param_index); @@ -44,13 +45,14 @@ struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int p return new; } -struct treenode *new_number(long val) +struct treenode *new_number(long val, int exprcount) { struct treenode *new = _new_plain(O_NUM); #ifdef DDTREE fprintf(stderr, "new_number: %i\n", val); #endif new->val = val; + new->exprcount = exprcount; return new; } @@ -65,7 +67,7 @@ static void write_indent(int i) void write_tree(struct treenode *node, int indent) { write_indent(indent); - fprintf(stderr, "%s @ %%%s\n", o_names[node->op], node->reg); + fprintf(stderr, "%s @ %%%s (%i)\n", o_names[node->op], node->reg, node->exprcount); if(node->kids[0] != TREENULL) { write_tree(node->kids[0], indent+1); } diff --git a/codea/tree.h b/codea/tree.h index 45626bd..27a9942 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -46,6 +46,7 @@ struct treenode { struct treenode *parent; int skip; int param_index; + int exprcount; }; typedef struct treenode *treenodep; @@ -57,9 +58,9 @@ typedef struct treenode *treenodep; #define STATE_LABEL(p) ((p)->label) #define PANIC printf -struct treenode *new_node(int op, struct treenode *l, struct treenode *r); -struct treenode *new_number(long val); -struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index); +struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount); +struct treenode *new_number(long val, int exprcount); +struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index, int exprcount); void write_tree(struct treenode *node, int ident); #endif -- 2.25.1