codea: parameteranzahl wird durchgereicht und ggf. geprueft wenn die eingabe nicht...
[uebersetzerbau-ss10.git] / codea / parser.y
index 5fc5c8e2d5b09d26791a41d393f1f4a2398ef9bd..a804229a7bf18e0e20eb404e2f38b9232b14af52 100644 (file)
         * 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@);
                }
          @}