codea: codegeruest wird generiert :)
[uebersetzerbau-ss10.git] / codea / parser.y
1 %{
2         #include <stdio.h>
3         #include <stdlib.h>
4         #include <string.h>
5         #include "symtable.h"
6         #include "chelper.h"
7         #include "tree.h"
8 %}
9
10 %start Input
11 %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN
12
13 @macro xxputsin(xx,)
14         @i xx = @Statement.sin@;
15 @end
16
17 @macro statinout()
18         @i @Statement.sout@ = @Statement.sin@;
19         /* das
20          *> xxputsin(@Statement.sout@,)
21          * geht nicht, weil verschachtelte macros deaktiviert sind */
22 @end
23
24 @autoinh s
25 @autosyn node
26
27 @attributes { char *name; } IDENT
28 @attributes { long val; } NUM
29 @attributes { struct symbol *f; } FeldID Parms Structdef Program
30 @attributes { struct symbol *s; } Methoddef Statseq Exprs
31 @attributes { struct symbol *s; struct treenode *node; } Lexpr Expr Minusterm Multerm Orterm Term Feld
32 @attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement
33
34 @traversal @postorder c
35 @traversal @postorder gen
36
37 %%
38 Input:
39           Program
40           @{
41             @i @Program.f@ = tab_new();
42             @gen @revorder(1) printf("\t.text\n");
43           @}
44         ;
45
46 Program:
47           Methoddef ';' Program
48           @{
49             @i @Methoddef.s@ = @Program.0.f@;
50             @i @Program.1.f@ = @Program.0.f@;
51           @}
52
53         | Structdef ';' Program
54           @{
55             @i @Program.1.f@ = tab_merge(@Program.0.f@, @Structdef.f@, 1);
56           @}
57         |
58         ;
59
60 Methoddef:
61           METHOD IDENT '(' Parms ')' Statseq END
62           @{
63             @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0);
64             @gen @revorder(1) func_header(@IDENT.name@);
65           @}
66         ;
67
68 Structdef:
69           STRUCT FeldID END
70           @{
71             @i @Structdef.f@ = @FeldID.f@;
72           @}
73         ;
74
75 Parms:
76           /* lokale Vars werden in Statement in die tabelle eingefuegt */
77           IDENT Parms
78           @{
79             @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_PARM, 1);
80           @}
81
82         |
83           @{
84             @i @Parms.f@ = tab_new();
85           @}
86         ;
87
88 FeldID:
89           IDENT FeldID
90           @{
91             @i @FeldID.0.f@ = tab_add_symbol(@FeldID.1.f@, @IDENT.name@, S_FIELD, 1);
92           @}
93
94         |
95           @{
96             @i @FeldID.f@ = tab_new();
97           @}
98         ;
99
100 Statseq:
101           Statement ';' Statseq
102           @{
103                 @i @Statement.sin@ = @Statseq.0.s@;
104                 @i @Statseq.1.s@ = @Statement.sout@;
105                 @gen burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1);
106           @}
107
108         |
109         ;
110
111 Statement:
112           Lexpr ASSIGN Expr
113           @{
114                 statinout()
115                 xxputsin(@Lexpr.s@,)
116                 xxputsin(@Expr.s@,)
117             @i @Statement.node@ = TREENULL;
118           @}
119
120         | VAR IDENT ASSIGN Expr
121           @{
122                 /* tab_clone ist hier noetig, vgl. folgendes statement
123                  * > var x := x - 1; */
124                 @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1);
125                 xxputsin(@Expr.s@,)
126             @i @Statement.node@ = TREENULL;
127           @}
128
129         | Expr
130           @{
131                 statinout()
132                 xxputsin(@Expr.s@,)
133             @i @Statement.node@ = TREENULL;
134           @}
135
136         | IF Expr THEN Statseq END
137           @{
138                 statinout()
139                 xxputsin(@Expr.s@,)
140                 xxputsin(@Statseq.s@,)
141             @i @Statement.node@ = TREENULL;
142           @}
143
144         | IF Expr THEN Statseq ELSE Statseq END
145           @{
146                 statinout()
147                 xxputsin(@Expr.s@,)
148                 xxputsin(@Statseq.0.s@,)
149                 xxputsin(@Statseq.1.s@,)
150             @i @Statement.node@ = TREENULL;
151           @}
152
153         | WHILE Expr DO Statseq END
154           @{
155                 statinout()
156                 xxputsin(@Expr.s@,)
157                 xxputsin(@Statseq.s@,)
158             @i @Statement.node@ = TREENULL;
159           @}
160
161         | RETURN Expr
162           @{
163                 statinout()
164                 xxputsin(@Expr.s@,)
165                 @i @Statement.node@ = new_node(O_RETURN, @Expr.node@, TREENULL);
166           @}
167         ;
168
169 Lexpr:
170           IDENT
171           @{
172             @i @Lexpr.node@ = TREENULL;
173                 @c check(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM);
174           @}
175
176         | Feld
177         ;
178
179 Feld: Term '.' IDENT
180           @{
181                 @c check(@Feld.s@, @IDENT.name@, S_FIELD);
182             @i @Feld.node@ = TREENULL;
183           @}
184         ;
185
186 Expr:
187           Term
188           @{
189             @i @Expr.node@ = TREENULL;
190           @}
191
192         | NOT Term
193           @{
194             @i @Expr.node@ = TREENULL;
195           @}
196
197         | Term Minusterm
198           @{
199             @i @Expr.node@ = TREENULL;
200           @}
201
202         | Term Multerm
203           @{
204             @i @Expr.node@ = TREENULL;
205           @}
206
207         | Term Orterm
208           @{
209             @i @Expr.node@ = TREENULL;
210           @}
211
212         | Term '<' Term
213           @{
214             @i @Expr.node@ = TREENULL;
215           @}
216
217         | Term '=' Term
218           @{
219             @i @Expr.node@ = TREENULL;
220           @}
221         ;
222
223 Minusterm:
224           '-' Term Minusterm
225           @{
226             @i @Minusterm.node@ = TREENULL;
227           @}
228
229         | '-' Term
230           @{
231             @i @Minusterm.node@ = TREENULL;
232           @}
233         ;
234
235 Multerm:
236           '*' Term Multerm
237           @{
238             @i @Multerm.node@ = TREENULL;
239           @}
240
241         | '*' Term
242           @{
243             @i @Multerm.node@ = TREENULL;
244           @}
245         ;
246
247 Orterm:
248           OR Term Orterm
249           @{
250             @i @Orterm.node@ = TREENULL;
251           @}
252         | OR Term
253           @{
254             @i @Orterm.node@ = TREENULL;
255           @}
256
257         ;
258
259 Term:
260           '(' Expr ')'
261           @{
262             @i @Term.node@ = TREENULL;
263           @}
264
265         | NUM
266           @{
267             @i @Term.node@ = TREENULL;
268           @}
269
270         | '-' NUM
271           @{
272             @i @Term.node@ = TREENULL;
273           @}
274
275         | THIS
276           @{
277             @i @Term.node@ = TREENULL;
278           @}
279
280         | IDENT
281           @{
282                 @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM);
283             @i @Term.node@ = TREENULL;
284           @}
285
286         | Feld
287           @{
288             @i @Term.node@ = TREENULL;
289           @}
290
291         | IDENT '(' Exprs ')'
292           @{
293             @i @Term.node@ = TREENULL;
294           @}
295
296         | Term '.' IDENT '(' Exprs ')'
297           @{
298             @i @Term.node@ = TREENULL;
299           @}
300
301         ;
302
303 Exprs:
304           Expr ',' Exprs
305         | Expr
306         |
307         ;
308 %%
309
310 extern int yylex();
311 extern int yylineno;
312
313 int yyerror(char *error_text)
314 {
315         fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
316         exit(2);
317 }
318
319 int main(int argc, char **argv)
320 {
321         #if 0
322         yydebug=1;
323         #endif
324         yyparse();
325         return 0;
326 }
327