X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=ag%2Fparser.y;h=dbd4e2412f340410fb84c702279515e8ba76f387;hb=7b8df533cad8c9a84e4da9b60f26b5109daef638;hp=3fe648bd80566301f325261c311d752afc42cf48;hpb=9ad86eed903ac2dc17a54c25ed369fc84255fac8;p=uebersetzerbau-ss10.git diff --git a/ag/parser.y b/ag/parser.y index 3fe648b..dbd4e24 100644 --- a/ag/parser.y +++ b/ag/parser.y @@ -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); }