X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=ag%2Fparser.y;h=494e6dfbde43f9dbae68fae328bced2fa9912564;hb=394a3c955a5b9a544355c52a0243f0da61998c83;hp=7eb49e888fe3ca39b5094fd32cd69b3cdb888bd8;hpb=c97419f3bacbfb2a50b9fe1b57cf500d1c00018f;p=uebersetzerbau-ss10.git diff --git a/ag/parser.y b/ag/parser.y index 7eb49e8..494e6df 100644 --- a/ag/parser.y +++ b/ag/parser.y @@ -5,199 +5,232 @@ #include "symtable.h" %} -%start Input -%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT -%token ID NUM ASSIGN GREATER - -@autoinh symbols - -@attributes { char *name; } ID -@attributes { struct symbol *fields; struct symbol *symbols; } Program -@attributes { struct symbol *fields; } Ids Structdef -@attributes { struct symbol *pars; } Pars -@attributes { struct symbol *symbols; } Funcdef Stats Bool Expr Call Lexpr Field Term Plusterm Malterm Bterm Orterm Exprs -@attributes { struct symbol *in_symbols; struct symbol *out_symbols; } Stat +%start Input +%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS +%token IDENT NUM ASSIGN + +@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 Parms +@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.symbols@ = @Program.fields@; @} - - ; - -Program: Funcdef ';' Program - @{ - @i @Program.0.fields@ = @Program.1.fields@; - @} - - | Structdef ';' Program - @{ - @i @Program.0.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1); - @i @Program.1.symbols@ = @Program.0.symbols@; - @} - - | - @{ @i @Program.fields@ = new_tab(); @} - - ; - -Funcdef: FUNC ID '(' Pars ')' Stats END - @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, @Pars.pars@, 0); @} - - | - FUNC ID '(' ')' Stats END - @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, new_tab(), 0); @} - - ; - -Structdef: STRUCT Ids END - @{ @i @Structdef.fields@ = @Ids.fields@; @} - - ; - -Ids: ID Ids - @{ @i @Ids.0.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @} - - | - @{ @i @Ids.fields@ = new_tab(); @} - - ; - -Pars: Pars ',' ID - @{ @i @Pars.0.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @} - - | ID - @{ @i @Pars.pars@ = tab_add_symbol(new_tab(), @ID.name@, S_VAR, 0); @} - - ; - -Stats: Stat ';' Stats - @{ - @i @Stat.in_symbols@ = @Stats.0.symbols@; - @i @Stats.1.symbols@ = @Stat.out_symbols@; - @} - - | - ; - -Stat: VAR ID ASSIGN Expr - @{ - @i @Stat.out_symbols@ = tab_add_symbol(clone_tab(@Stat.in_symbols@), @ID.name@, S_VAR, 0); - @i @Expr.symbols@ = @Stat.in_symbols@; - @} - - | Lexpr ASSIGN Expr - @{ - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @i @Lexpr.symbols@ = @Stat.in_symbols@; - @i @Expr.symbols@ = @Stat.in_symbols@; - @} - - | IF Bool THEN Stats END - @{ - @i @Bool.symbols@ = @Stat.in_symbols@; - @i @Stats.symbols@ = @Stat.in_symbols@; - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @} - - | IF Bool THEN Stats ELSE Stats END - @{ - @i @Bool.symbols@ = @Stat.in_symbols@; - @i @Stats.0.symbols@ = @Stat.in_symbols@; - @i @Stats.1.symbols@ = @Stat.in_symbols@; - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @} - - | WHILE Bool DO Stats END - @{ - @i @Bool.symbols@ = @Stat.in_symbols@; - @i @Stats.symbols@ = @Stat.in_symbols@; - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @} - - | Call - @{ - @i @Call.symbols@ = @Stat.in_symbols@; - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @} - - | RETURN Expr - @{ - @i @Expr.symbols@ = @Stat.in_symbols@; - @i @Stat.out_symbols@ = @Stat.in_symbols@; - @} - - ; - -Lexpr: ID - @{ @c check_variable(@Lexpr.symbols@, @ID.name@); @} - - | Field - ; - -Expr: '-' Term - | Term - | Term Plusterm - | Term Malterm - ; - -Plusterm: '+' Term Plusterm - | '+' Term - ; - -Malterm: '*' Term Malterm - | '*' Term - ; - -Term: '(' Expr ')' - | ID - @{ @c check_variable(@Term.symbols@, @ID.name@); @} - - | NUM - | Call - | Field - ; - -Bool: Bterm - | Bterm Orterm - | NOT Bterm - ; - -Orterm: OR Bterm Orterm - | OR Bterm - ; - -Bterm: Term GREATER Term - | Term '=' Term - | '(' Bool ')' - ; - -Field: Term '.' ID - @{ @c check_field(@Field.symbols@, @ID.name@); @} - - ; - -Call: ID '(' Exprs ')' - | ID '(' ')' - ; - -Exprs: Expr - | Exprs ',' Expr - ; - +Input: + Program + @{ + @i @Program.s@ = @Program.f@; + @} + ; + +Program: + Methoddef ';' Program + @{ + @i @Program.0.f@ = @Program.1.f@; + @} + + | Structdef ';' Program + @{ + @i @Program.0.f@ = tab_merge(@Structdef.f@, @Program.1.f@, 1); + @} + + | + @{ + @i @Program.0.f@ = new_tab(); + @} + ; + +Methoddef: + METHOD IDENT '(' Parms ')' Statseq END + @{ + @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0); + @} + ; + +Structdef: + STRUCT Idents END + @{ + @i @Structdef.f@ = @Idents.f@; + @} + ; + +Parms: + /* lokale Vars werden in Statement in die tabelle eingefuegt */ + IDENT Parms + @{ + @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_VAR, 1); + @} + + | + @{ + @i @Parms.f@ = new_tab(); + @} + ; + +Idents: + IDENT Idents + @{ + @i @Idents.0.f@ = tab_add_symbol(@Idents.1.f@, @IDENT.name@, S_FIELD, 1); + @} + + | + @{ + @i @Idents.f@ = new_tab(); + @} + ; + +Statseq: + Statement ';' Statseq + @{ + @i @Statement.sin@ = @Statseq.0.s@; + @i @Statseq.1.s@ = @Statement.sout@; + @} + + | + ; + +Statement: + Lexpr ASSIGN Expr + @{ + 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, 1); + xxputsin(@Expr.s@,) + @} + + | Expr + @{ + statinout() + xxputsin(@Expr.s@,) + @} + + | IF Expr THEN Statseq END + @{ + statinout() + xxputsin(@Expr.s@,) + xxputsin(@Statseq.s@,) + @} + + | IF Expr THEN Statseq ELSE Statseq END + @{ + statinout() + xxputsin(@Expr.s@,) + xxputsin(@Statseq.0.s@,) + xxputsin(@Statseq.1.s@,) + @} + + | WHILE Expr DO Statseq END + @{ + statinout() + xxputsin(@Expr.s@,) + xxputsin(@Statseq.s@,) + @} + + | RETURN Expr + @{ + statinout() + xxputsin(@Expr.s@,) + @} + ; + +Lexpr: + IDENT + @{ + @c check(@Lexpr.s@, @IDENT.name@, S_VAR); + @} + + | Feld + ; + +Feld: Term '.' IDENT + @{ + @c check(@Feld.s@, @IDENT.name@, S_FIELD); + @} + ; + +Expr: + Term + | NOT Term + | Term Minusterm + | Term Multerm + | Term Orterm + | Term '<' Term + | Term '=' Term + ; + +Minusterm: + '-' Term Minusterm + | '-' Term + ; + +Multerm: + '*' Term Multerm + | '*' Term + ; + +Orterm: + OR Term Orterm + | OR Term + ; + +Term: + '(' Expr ')' + | NUM + | '-' NUM + | THIS + | IDENT + @{ + @c check(@Term.s@, @IDENT.name@, S_VAR); + @} + + | Feld + | IDENT '(' Exprs ')' + | Term '.' IDENT '(' Exprs ')' + ; + +Exprs: + Expr ',' Exprs + | Expr + | + ; %% extern int yylex(); extern int yylineno; -int yyerror(char *error_text) { - fprintf(stderr,"Line %i: %s\n",yylineno, error_text); +int yyerror(char *error_text) +{ + fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text); exit(2); } -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ + #if 0 + yydebug=1; + #endif yyparse(); return 0; }