X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=codea%2Fparser.y;h=a804229a7bf18e0e20eb404e2f38b9232b14af52;hb=59fef9f82e073cef75cb5f338a41e1a1bbfa4b18;hp=5fc5c8e2d5b09d26791a41d393f1f4a2398ef9bd;hpb=0b896148b2f89bc42079c40ea8ce43d73d4a2c36;p=uebersetzerbau-ss10.git diff --git a/codea/parser.y b/codea/parser.y index 5fc5c8e..a804229 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -21,17 +21,29 @@ * geht nicht, weil verschachtelte macros deaktiviert sind */ @end -@autoinh s -@autosyn node imm exprcount +/* beschreibung der attribute + * s: + * f: + * gparamges: + * parms: + * node: + * imm: + * exprcount: + * sin: + * sout: + */ +@autoinh s gparamges +@autosyn node imm @attributes { char *name; } IDENT @attributes { long val; } NUM -@attributes { struct symbol *f; int parms; } Parms +@attributes { struct symbol *f; int paramges; 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; 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 +@attributes { struct symbol *s; } Methoddef +@attributes { struct symbol *s; int gparamges; } Statseq Exprs +@attributes { struct symbol *s; int gparamges; struct treenode *node; short imm; int exprcount; } Expr Minusterm Term +@attributes { struct symbol *s; int gparamges; struct treenode *node; } Lexpr Multerm Orterm Feld +@attributes { struct symbol *sin; int gparamges; struct symbol *sout; struct treenode *node; } Statement @traversal @postorder c @traversal @preorder reg @@ -65,6 +77,7 @@ Methoddef: @{ @i @Parms.parms@ = 1; @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0); + @i @Statseq.gparamges@ = @Parms.paramges@; @gen @revorder(1) func_header(@IDENT.name@); @} ; @@ -81,12 +94,14 @@ Parms: IDENT Parms @{ @i @Parms.1.parms@ = @Parms.parms@ + 1; + @i @Parms.0.paramges@ = @Parms.1.paramges@; @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_PARM, 1, @Parms.parms@); @} | @{ @i @Parms.f@ = tab_new(); + @i @Parms.paramges@ = @Parms.parms@; @} ; @@ -168,7 +183,7 @@ Statement: statinout() xxputsin(@Expr.s@,) @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; + @reg @Statement.node@->reg = next_reg((char *)NULL, 0, @Expr.gparamges@); @Expr.node@->reg = @Statement.node@->reg; @} ; @@ -212,7 +227,7 @@ Expr: /* TODO */ @Term.node@->reg = @Expr.node@->reg; @Term.node@->skip = 1; - @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip); + @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip, @Expr.gparamges@); } @} @@ -252,7 +267,7 @@ Minusterm: @reg { @Minusterm.1.node@->reg = @Minusterm.node@->reg; - @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip); + @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip, @Minusterm.gparamges@); } @}