9 %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
10 %token IDENT NUM ASSIGN
12 /* TODO: macro, see oxURM.ps @ p. 25 */
17 @attributes { char *name; } IDENT
18 @attributes { struct symbol *f; struct symbol *s; } Program
19 @attributes { struct symbol *f; } Idents Structdef
20 @attributes { struct symbol *p; } Parms
21 @attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm
23 @attributes { struct symbol *sin; struct symbol *sout; } Statement
25 @traversal @postorder c
32 @i @Program.s@ = @Program.f@;
39 @i @Program.0.f@ = @Program.1.f@;
42 | Structdef ';' Program
44 @i @Program.0.f@ = tab_merge(@Structdef.f@, @Program.1.f@, 1);
49 @i @Program.0.f@ = new_tab();
55 METHOD IDENT '(' Parms ')' Statseq END
57 @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.p@, 0);
65 @i @Structdef.f@ = @Idents.f@;
71 /* lokale Vars werden in Statement in die tabelle eingefuegt */
74 @i @Parms.0.p@ = tab_add_symbol(@Parms.1.p@, @IDENT.name@, S_VAR, 1);
79 @i @Parms.p@ = new_tab();
87 @i @Idents.0.f@ = tab_add_symbol(@Idents.1.f@, @IDENT.name@, S_FIELD, 1);
92 @i @Idents.f@ = new_tab();
100 @i @Statement.sin@ = @Statseq.0.s@;
101 @i @Statseq.1.s@ = @Statement.sout@;
111 @i @Statement.sout@ = @Statement.sin@;
112 @i @Lexpr.s@ = @Statement.sin@;
113 @i @Expr.s@ = @Statement.sin@;
116 | VAR IDENT ASSIGN Expr
118 @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 0);
119 @i @Expr.s@ = @Statement.sin@;
124 @i @Expr.s@ = @Statement.sin@;
125 @i @Statement.sout@ = @Statement.sin@;
128 | IF Expr THEN Statseq END
130 @i @Expr.s@ = @Statement.sin@;
131 @i @Statseq.s@ = @Statement.sin@;
132 @i @Statement.sout@ = @Statement.sin@;
135 | IF Expr THEN Statseq ELSE Statseq END
137 @i @Expr.s@ = @Statement.sin@;
138 @i @Statseq.0.s@ = @Statement.sin@;
139 @i @Statseq.1.s@ = @Statement.sin@;
140 @i @Statement.sout@ = @Statement.sin@;
143 | WHILE Expr DO Statseq END
145 @i @Expr.s@ = @Statement.sin@;
146 @i @Statseq.s@ = @Statement.sin@;
147 @i @Statement.sout@ = @Statement.sin@;
152 @i @Expr.s@ = @Statement.sin@;
153 @i @Statement.sout@ = @Statement.sin@;
161 @c check_variable(@Lexpr.s@, @IDENT.name@);
169 @c check_field(@Feld.s@, @IDENT.name@);
207 @c check_variable(@Term.s@, @IDENT.name@);
211 | IDENT '(' Exprs ')'
213 @c check_variable(@Term.s@, @IDENT.name@);
216 | Term '.' IDENT '(' Exprs ')'
218 @c check_variable(@Term.s@, @IDENT.name@);
223 /* beachte dass hier auch "nichts" vorkommen kann
224 * sonst waer ein aufruf der art 'f()' nicht
225 * moeglich (leere parameterliste) */
236 int yyerror(char *error_text)
238 fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
242 int main(int argc, char **argv)