9 %token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
10 %token ID NUM ASSIGN GREATER
14 @attributes { char *name; } ID
15 @attributes { struct symbol *fields; struct symbol *symbols; } Program
16 @attributes { struct symbol *fields; } Ids Structdef
17 @attributes { struct symbol *pars; } Pars
18 @attributes { struct symbol *symbols; } Funcdef Stats Bool Expr Call Lexpr Field Term Plusterm Malterm Bterm Orterm Exprs
19 @attributes { struct symbol *in_symbols; struct symbol *out_symbols; } Stat
21 @traversal @postorder c
26 @{ @i @Program.symbols@ = @Program.fields@; @}
30 Program: Funcdef ';' Program
32 @i @Program.0.fields@ = @Program.1.fields@;
35 | Structdef ';' Program
37 @i @Program.0.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1);
38 @i @Program.1.symbols@ = @Program.0.symbols@;
42 @{ @i @Program.fields@ = new_tab(); @}
46 Funcdef: FUNC ID '(' Pars ')' Stats END
47 @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, @Pars.pars@, 0); @}
50 FUNC ID '(' ')' Stats END
51 @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, new_tab(), 0); @}
55 Structdef: STRUCT Ids END
56 @{ @i @Structdef.fields@ = @Ids.fields@; @}
61 @{ @i @Ids.0.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @}
64 @{ @i @Ids.fields@ = new_tab(); @}
69 @{ @i @Pars.0.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @}
72 @{ @i @Pars.pars@ = tab_add_symbol(new_tab(), @ID.name@, S_VAR, 0); @}
78 @i @Stat.in_symbols@ = @Stats.0.symbols@;
79 @i @Stats.1.symbols@ = @Stat.out_symbols@;
85 Stat: VAR ID ASSIGN Expr
87 @i @Stat.out_symbols@ = tab_add_symbol(clone_tab(@Stat.in_symbols@), @ID.name@, S_VAR, 0);
88 @i @Expr.symbols@ = @Stat.in_symbols@;
93 @i @Stat.out_symbols@ = @Stat.in_symbols@;
94 @i @Lexpr.symbols@ = @Stat.in_symbols@;
95 @i @Expr.symbols@ = @Stat.in_symbols@;
98 | IF Bool THEN Stats END
100 @i @Bool.symbols@ = @Stat.in_symbols@;
101 @i @Stats.symbols@ = @Stat.in_symbols@;
102 @i @Stat.out_symbols@ = @Stat.in_symbols@;
105 | IF Bool THEN Stats ELSE Stats END
107 @i @Bool.symbols@ = @Stat.in_symbols@;
108 @i @Stats.0.symbols@ = @Stat.in_symbols@;
109 @i @Stats.1.symbols@ = @Stat.in_symbols@;
110 @i @Stat.out_symbols@ = @Stat.in_symbols@;
113 | WHILE Bool DO Stats END
115 @i @Bool.symbols@ = @Stat.in_symbols@;
116 @i @Stats.symbols@ = @Stat.in_symbols@;
117 @i @Stat.out_symbols@ = @Stat.in_symbols@;
122 @i @Call.symbols@ = @Stat.in_symbols@;
123 @i @Stat.out_symbols@ = @Stat.in_symbols@;
128 @i @Expr.symbols@ = @Stat.in_symbols@;
129 @i @Stat.out_symbols@ = @Stat.in_symbols@;
135 @{ @c check_variable(@Lexpr.symbols@, @ID.name@); @}
146 Plusterm: '+' Term Plusterm
150 Malterm: '*' Term Malterm
156 @{ @c check_variable(@Term.symbols@, @ID.name@); @}
168 Orterm: OR Bterm Orterm
172 Bterm: Term GREATER Term
178 @{ @c check_field(@Field.symbols@, @ID.name@); @}
182 Call: ID '(' Exprs ')'
195 int yyerror(char *error_text) {
196 fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
200 int main(int argc, char **argv) {