11 %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN
14 @i xx = @Statement.sin@;
18 @i @Statement.sout@ = @Statement.sin@;
20 *> xxputsin(@Statement.sout@,)
21 * geht nicht, weil verschachtelte macros deaktiviert sind */
27 @attributes { char *name; } IDENT
28 @attributes { long val; } NUM
29 @attributes { struct symbol *f; int parms; } Parms
30 @attributes { struct symbol *f; } FeldID Structdef Program
31 @attributes { struct symbol *s; } Methoddef Statseq Exprs
32 @attributes { struct symbol *s; struct treenode *node; } Lexpr Expr Minusterm Multerm Orterm Term Feld
33 @attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement
35 @traversal @postorder c
36 @traversal @preorder reg
37 @traversal @postorder gen
43 @i @Program.f@ = tab_new();
44 @gen @revorder(1) printf("\t.text\n");
51 @i @Methoddef.s@ = @Program.0.f@;
52 @i @Program.1.f@ = @Program.0.f@;
55 | Structdef ';' Program
57 @i @Program.1.f@ = tab_merge(@Program.0.f@, @Structdef.f@, 1);
63 METHOD IDENT '(' Parms ')' Statseq END
66 @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0);
67 @gen @revorder(1) func_header(@IDENT.name@);
74 @i @Structdef.f@ = @FeldID.f@;
79 /* lokale Vars werden in Statement in die tabelle eingefuegt */
82 @i @Parms.1.parms@ = @Parms.parms@ + 1;
83 @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_PARM, 1, @Parms.parms@);
88 @i @Parms.f@ = tab_new();
95 @i @FeldID.0.f@ = tab_add_symbol(@FeldID.1.f@, @IDENT.name@, S_FIELD, 1, -1);
100 @i @FeldID.f@ = tab_new();
105 Statement ';' Statseq
107 @i @Statement.sin@ = @Statseq.0.s@;
108 @i @Statseq.1.s@ = @Statement.sout@;
109 @gen burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1);
121 @i @Statement.node@ = TREENULL;
124 | VAR IDENT ASSIGN Expr
126 /* tab_clone ist hier noetig, vgl. folgendes statement
127 * > var x := x - 1; */
128 @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, -1);
130 @i @Statement.node@ = TREENULL;
137 @i @Statement.node@ = TREENULL;
140 | IF Expr THEN Statseq END
144 xxputsin(@Statseq.s@,)
145 @i @Statement.node@ = TREENULL;
148 | IF Expr THEN Statseq ELSE Statseq END
152 xxputsin(@Statseq.0.s@,)
153 xxputsin(@Statseq.1.s@,)
154 @i @Statement.node@ = TREENULL;
157 | WHILE Expr DO Statseq END
161 xxputsin(@Statseq.s@,)
162 @i @Statement.node@ = TREENULL;
169 @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL);
170 @reg @Statement.node@->reg = next_reg((char *)NULL, 0); @Expr.node@->reg = @Statement.node@->reg;
177 @i @Lexpr.node@ = TREENULL;
178 @c check(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM);
186 @c check(@Feld.s@, @IDENT.name@, S_FIELD);
187 @i @Feld.node@ = TREENULL;
188 @reg fprintf(stderr, "w00t8\n");
195 @reg @Term.node@->reg = @Expr.node@->reg;
200 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t2\n");
205 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t3\n");
210 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t4\n");
215 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t5\n");
220 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t6\n");
225 @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t7\n");
232 @i @Minusterm.node@ = TREENULL;
233 @reg fprintf(stderr, "minus1\n");
238 @i @Minusterm.node@ = TREENULL;
239 @reg fprintf(stderr, "minus2\n");
246 @i @Multerm.node@ = TREENULL;
247 @reg fprintf(stderr, "mul1\n");
252 @i @Multerm.node@ = TREENULL;
253 @reg fprintf(stderr, "mul2\n");
260 @i @Orterm.node@ = TREENULL;
261 @reg fprintf(stderr, "or1\n");
265 @i @Orterm.node@ = TREENULL;
266 @reg fprintf(stderr, "or2\n");
274 @i @Term.node@ = TREENULL;
275 @reg fprintf(stderr, "wtf1\n");
280 @i @Term.node@ = TREENULL;
281 @reg fprintf(stderr, "wtf2\n");
286 @i @Term.node@ = TREENULL;
287 @reg fprintf(stderr, "wtf3\n");
292 @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); @Term.node@->param_index = 0;
293 @reg fprintf(stderr, "wtf4\n");
298 @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM);
299 @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); {
301 if((tmp = tab_lookup(@Term.s@, @IDENT.name@, S_PARM)) != TREENULL) {
302 @Term.node@->param_index = tmp->param_index;
305 @reg fprintf(stderr, "wtf5\n");
310 @i @Term.node@ = TREENULL;
311 @reg fprintf(stderr, "wtf6\n");
314 | IDENT '(' Exprs ')'
316 @i @Term.node@ = TREENULL;
317 @reg fprintf(stderr, "wtf7\n");
320 | Term '.' IDENT '(' Exprs ')'
322 @i @Term.node@ = TREENULL;
323 @reg fprintf(stderr, "wtf8\n");
338 int yyerror(char *error_text)
340 fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
344 int main(int argc, char **argv)