X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=codea%2Fparser.y;h=5fc5c8e2d5b09d26791a41d393f1f4a2398ef9bd;hb=0b896148b2f89bc42079c40ea8ce43d73d4a2c36;hp=e75f2efcd55d1b4eb76dbca072bb89adce393e12;hpb=9ac1f0e860f07bb8b7e57ee95d572827a4211de9;p=uebersetzerbau-ss10.git diff --git a/codea/parser.y b/codea/parser.y index e75f2ef..5fc5c8e 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; @} ; @@ -193,60 +193,61 @@ Expr: Term @{ @reg @Term.node@->reg = @Expr.node@->reg; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term\n"); @} | NOT Term @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- NOT Term\n"); @} | Term Minusterm @{ - @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@); + @i @Expr.exprcount@ = 1 + @Term.exprcount@ + @Minusterm.exprcount@; fprintf(stderr, "(Expr)- Term Minusterm\n"); + @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@, @Expr.exprcount@); @i @Expr.imm@ = @Term.imm@ && @Minusterm.imm@; @reg { /* TODO */ - fprintf(stderr, "at_expr: Minusterm.imm \"%i\", Term.imm \"%i\"\n", @Minusterm.imm@, @Term.imm@); - #if 0 - if(@Minusterm.imm@) { - @Minusterm.node@->reg = @Expr.node@->reg; - @Term.node@->reg = next_reg(@Minusterm.node@->reg, @Expr.node@->skip); - @Minusterm.node@->skip = 1; - } else { - #endif - @Term.node@->reg = @Expr.node@->reg; - @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip); + @Term.node@->reg = @Expr.node@->reg; + @Term.node@->skip = 1; + @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip); } @} | Term Multerm @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term Multerm\n"); @} | Term Orterm @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term OrTerm\n"); @} | Term '<' Term @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; + @i @Expr.exprcount@ = 1 + @Term.0.exprcount@ + @Term.1.exprcount@; fprintf(stderr, "(Expr)- Term < Term\n"); @} | Term '=' Term @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; + @i @Expr.exprcount@ = 1 + @Term.0.exprcount@ + @Term.1.exprcount@; fprintf(stderr, "(Expr)- Term = Term\n"); @} ; Minusterm: '-' Term Minusterm @{ - @i @Minusterm.node@ = new_node(O_ADD, @Minusterm.1.node@, @Term.node@); + @i @Minusterm.0.exprcount@ = 1 + @Term.exprcount@ + @Minusterm.1.exprcount@; fprintf(stderr, "(Minusterm)- - Term Minusterm\n"); + @i @Minusterm.node@ = new_node(O_ADD, @Minusterm.1.node@, @Term.node@, @Minusterm.0.exprcount@); @i @Minusterm.imm@ = @Term.imm@ && @Minusterm.1.imm@; @reg { @@ -257,6 +258,7 @@ Minusterm: | '-' Term @{ + @i @Minusterm.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Minusterm)- - Term\n"); @reg @Term.node@->reg = @Minusterm.node@->reg; @} ; @@ -289,30 +291,35 @@ Term: '(' Expr ')' @{ @i @Term.node@ = @Expr.node@; + @i @Term.exprcount@ = @Expr.exprcount@ + 1; fprintf(stderr, "(Term)- ( Expr )\n"); @} | NUM @{ - @i @Term.node@ = new_number(@NUM.val@); + @i @Term.exprcount@ = 1; fprintf(stderr, "(Term)- NUM\n"); + @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; fprintf(stderr, "(Term)- - NUM\n"); + @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; fprintf(stderr, "(Term)- THIS\n"); + @i @Term.node@ = new_param(O_ID, strdup("this"), 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; fprintf(stderr, "(Term)- IDENT\n"); + @i @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, @Term.exprcount@); @i @Term.imm@ = 0; @} @@ -320,18 +327,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; @} ;