ppc: fixed stack fail und ein kleines clean up
[uebersetzerbau-ss10.git] / ag / parser.y
index 3fe648bd80566301f325261c311d752afc42cf48..dbd4e2412f340410fb84c702279515e8ba76f387 100644 (file)
@@ -6,92 +6,86 @@
 %}
 
 %start Input
-%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
-%token IDENT NUM ASSIGN
+%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN
 
-/* TODO: macro, see oxURM.ps @ p. 25 */
+@macro xxputsin(xx,)
+       @i xx = @Statement.sin@;
+@end
+
+@macro statinout()
+       @i @Statement.sout@ = @Statement.sin@;
+       /* das
+        *> xxputsin(@Statement.sout@,)
+        * geht nicht, weil verschachtelte macros deaktiviert sind */
+@end
 
 @autoinh s
-/* f .. fields
- * s .. symbols  */
 @attributes { char *name; } IDENT
-@attributes { struct symbol *f; struct symbol *s; } Program
-@attributes { struct symbol *f; } Idents Structdef
-@attributes { struct symbol *p; } Parms
-@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm
-Term Exprs
+@attributes { struct symbol *f; } FeldID Parms Structdef Program
+@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm Term Exprs Feld
 @attributes { struct symbol *sin; struct symbol *sout; } Statement
 
 @traversal @postorder c
 
 %%
-
 Input:
          Program
          @{
-               @i @Program.s@ = @Program.f@;
+           @i @Program.f@ = tab_new();
          @}
        ;
 
 Program:
          Methoddef ';' Program
          @{
-           @i @Program.0.f@ = @Program.1.f@;
+           @i @Methoddef.s@ = @Program.0.f@;
+           @i @Program.1.f@ = @Program.0.f@;
          @}
-         
+
        | Structdef ';' Program
          @{
-           @i @Program.0.f@ = tab_merge(@Structdef.f@, @Program.1.f@, 1);
+           @i @Program.1.f@ = tab_merge(@Program.0.f@, @Structdef.f@, 1);
          @}
-
        |
-         @{
-               @i @Program.0.f@ = new_tab();
-         @}
-
        ;
 
 Methoddef:
          METHOD IDENT '(' Parms ')' Statseq END
          @{
-           @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.p@, 0);
+           @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0);
          @}
-
        ;
 
 Structdef:
-         STRUCT Idents END
+         STRUCT FeldID END
          @{
-           @i @Structdef.f@ = @Idents.f@;
+           @i @Structdef.f@ = @FeldID.f@;
          @}
-
        ;
 
 Parms:
          /* lokale Vars werden in Statement in die tabelle eingefuegt */
          IDENT Parms
          @{
-           @i @Parms.0.p@ = tab_add_symbol(@Parms.1.p@, @IDENT.name@, S_VAR, 1);
+           @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_VAR, 1);
          @}
 
        |
          @{
-           @i @Parms.p@ = new_tab();
+           @i @Parms.f@ = tab_new();
          @}
-
        ;
 
-Idents:
-         IDENT Idents
+FeldID:
+         IDENT FeldID
          @{
-           @i @Idents.0.f@ = tab_add_symbol(@Idents.1.f@, @IDENT.name@, S_FIELD, 1);
+           @i @FeldID.0.f@ = tab_add_symbol(@FeldID.1.f@, @IDENT.name@, S_FIELD, 1);
          @}
 
        |
          @{
-           @i @Idents.f@ = new_tab();
+           @i @FeldID.f@ = tab_new();
          @}
-
        ;
 
 Statseq:
@@ -102,70 +96,72 @@ Statseq:
          @}
 
        |
-
        ;
 
 Statement:
          Lexpr ASSIGN Expr
          @{
-               @i @Statement.sout@ = @Statement.sin@;
-               @i @Lexpr.s@ = @Statement.sin@;
-               @i @Expr.s@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Lexpr.s@,)
+               xxputsin(@Expr.s@,)
          @}
 
        | VAR IDENT ASSIGN Expr
          @{
-               @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 0);
-               @i @Expr.s@ = @Statement.sin@;
+               /* 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);
+               xxputsin(@Expr.s@,)
          @}
 
        | Expr
          @{
-               @i @Expr.s@ = @Statement.sin@;
-               @i @Statement.sout@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Expr.s@,)
          @}
 
        | IF Expr THEN Statseq END
          @{
-               @i @Expr.s@ = @Statement.sin@;
-               @i @Statseq.s@ = @Statement.sin@;
-               @i @Statement.sout@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Expr.s@,)
+               xxputsin(@Statseq.s@,)
          @}
 
        | IF Expr THEN Statseq ELSE Statseq END
          @{
-               @i @Expr.s@ = @Statement.sin@;
-               @i @Statseq.0.s@ = @Statement.sin@;
-               @i @Statseq.1.s@ = @Statement.sin@;
-               @i @Statement.sout@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Expr.s@,)
+               xxputsin(@Statseq.0.s@,)
+               xxputsin(@Statseq.1.s@,)
          @}
 
        | WHILE Expr DO Statseq END
          @{
-               @i @Expr.s@ = @Statement.sin@;
-               @i @Statseq.s@ = @Statement.sin@;
-               @i @Statement.sout@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Expr.s@,)
+               xxputsin(@Statseq.s@,)
          @}
 
        | RETURN Expr
          @{
-               @i @Expr.s@ = @Statement.sin@;
-               @i @Statement.sout@ = @Statement.sin@;
+               statinout()
+               xxputsin(@Expr.s@,)
          @}
-
        ;
 
 Lexpr:
          IDENT
          @{
-               @c check_variable(@Lexpr.s@, @IDENT.name@);
+               @c check(@Lexpr.s@, @IDENT.name@, S_VAR);
          @}
 
-       | Term '.' IDENT
+       | Feld
+       ;
+
+Feld: Term '.' IDENT
          @{
-               @c check_variable(@Lexpr.s@, @IDENT.name@);
+               @c check(@Feld.s@, @IDENT.name@, S_FIELD);
          @}
-
        ;
 
 Expr:
@@ -193,7 +189,6 @@ Orterm:
        | OR Term
        ;
 
-
 Term:
          '(' Expr ')'
        | NUM
@@ -201,34 +196,19 @@ Term:
        | THIS
        | IDENT
          @{
-               @c check_variable(@Term.s@, @IDENT.name@);
-         @}
-
-       | Term '.' IDENT
-         @{
-               @c check_variable(@Term.s@, @IDENT.name@);
+               @c check(@Term.s@, @IDENT.name@, S_VAR);
          @}
 
+       | Feld
        | IDENT '(' Exprs ')'
-         @{
-               @c check_variable(@Term.s@, @IDENT.name@);
-         @}
-
        | Term '.' IDENT '(' Exprs ')'
-         @{
-               @c check_variable(@Term.s@, @IDENT.name@);
-         @}
-
        ;
 
-/* beachte dass hier auch "nichts" vorkommen kann
- * sonst waer ein aufruf der art 'f()' nicht
- * moeglich (leere parameterliste) */
 Exprs:
+         Expr ',' Exprs
        | Expr
-       | Exprs ',' Expr
+       |
        ;
-
 %%
 
 extern int yylex();
@@ -236,7 +216,7 @@ extern int yylineno;
 
 int yyerror(char *error_text)
 {
-       fprintf(stderr,"Line %i: %s\n", yylineno, error_text);
+       fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
        exit(2);
 }