ag: scope von feldern
[uebersetzerbau-ss10.git] / ag / parser.y
1 %{
2         #include <stdio.h>
3         #include <stdlib.h>
4         #include <string.h>
5         #include "symtable.h"
6 %}
7
8 %start Input
9 %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
10 %token IDENT NUM ASSIGN
11
12 @macro xxputsin(xx,)
13         @i xx = @Statement.sin@;
14 @end
15
16 @macro statinout()
17         @i @Statement.sout@ = @Statement.sin@;
18         /* das
19          *> xxputsin(@Statement.sout@,)
20          * geht nicht, weil verschachtelte macros deaktiviert sind */
21 @end
22
23 @autoinh s
24 @attributes { char *name; } IDENT
25 @attributes { struct symbol *f; } FeldID Parms Structdef Program
26 @attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm Term Exprs Feld
27 @attributes { struct symbol *sin; struct symbol *sout; } Statement
28
29 @traversal @postorder c
30
31 %%
32 Input:
33           Program
34           @{
35             @i @Program.f@ = new_tab();
36           @}
37         ;
38
39 Program:
40           Methoddef ';' Program
41           @{
42             @i @Methoddef.s@ = @Program.0.f@;
43             @i @Program.1.f@ = @Program.0.f@;
44           @}
45
46         | Structdef ';' Program
47           @{
48             @i @Program.1.f@ = tab_merge(@Program.0.f@, @Structdef.f@, 1);
49           @}
50         |
51         ;
52
53 Methoddef:
54           METHOD IDENT '(' Parms ')' Statseq END
55           @{
56             @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.f@, 0);
57           @}
58         ;
59
60 Structdef:
61           STRUCT FeldID END
62           @{
63             @i @Structdef.f@ = @FeldID.f@;
64           @}
65         ;
66
67 Parms:
68           /* lokale Vars werden in Statement in die tabelle eingefuegt */
69           IDENT Parms
70           @{
71             @i @Parms.0.f@ = tab_add_symbol(@Parms.1.f@, @IDENT.name@, S_VAR, 1);
72           @}
73
74         |
75           @{
76             @i @Parms.f@ = new_tab();
77           @}
78         ;
79
80 FeldID:
81           IDENT FeldID
82           @{
83             @i @FeldID.0.f@ = tab_add_symbol(@FeldID.1.f@, @IDENT.name@, S_FIELD, 1);
84           @}
85
86         |
87           @{
88             @i @FeldID.f@ = new_tab();
89           @}
90         ;
91
92 Statseq:
93           Statement ';' Statseq
94           @{
95                 @i @Statement.sin@ = @Statseq.0.s@;
96                 @i @Statseq.1.s@ = @Statement.sout@;
97           @}
98
99         |
100         ;
101
102 Statement:
103           Lexpr ASSIGN Expr
104           @{
105                 statinout()
106                 xxputsin(@Lexpr.s@,)
107                 xxputsin(@Expr.s@,)
108           @}
109
110         | VAR IDENT ASSIGN Expr
111           @{
112                 @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
113                 xxputsin(@Expr.s@,)
114           @}
115
116         | Expr
117           @{
118                 statinout()
119                 xxputsin(@Expr.s@,)
120           @}
121
122         | IF Expr THEN Statseq END
123           @{
124                 statinout()
125                 xxputsin(@Expr.s@,)
126                 xxputsin(@Statseq.s@,)
127           @}
128
129         | IF Expr THEN Statseq ELSE Statseq END
130           @{
131                 statinout()
132                 xxputsin(@Expr.s@,)
133                 xxputsin(@Statseq.0.s@,)
134                 xxputsin(@Statseq.1.s@,)
135           @}
136
137         | WHILE Expr DO Statseq END
138           @{
139                 statinout()
140                 xxputsin(@Expr.s@,)
141                 xxputsin(@Statseq.s@,)
142           @}
143
144         | RETURN Expr
145           @{
146                 statinout()
147                 xxputsin(@Expr.s@,)
148           @}
149         ;
150
151 Lexpr:
152           IDENT
153           @{
154                 @c check(@Lexpr.s@, @IDENT.name@, S_VAR);
155           @}
156
157         | Feld
158         ;
159
160 Feld: Term '.' IDENT
161           @{
162                 @c check(@Feld.s@, @IDENT.name@, S_FIELD);
163           @}
164         ;
165
166 Expr:
167           Term
168         | NOT Term
169         | Term Minusterm
170         | Term Multerm
171         | Term Orterm
172         | Term '<' Term
173         | Term '=' Term
174         ;
175
176 Minusterm:
177           '-' Term Minusterm
178         | '-' Term
179         ;
180
181 Multerm:
182           '*' Term Multerm
183         | '*' Term
184         ;
185
186 Orterm:
187           OR Term Orterm
188         | OR Term
189         ;
190
191 Term:
192           '(' Expr ')'
193         | NUM
194         | '-' NUM
195         | THIS
196         | IDENT
197           @{
198                 @c check(@Term.s@, @IDENT.name@, S_VAR);
199           @}
200
201         | Feld
202         | IDENT '(' Exprs ')'
203         | Term '.' IDENT '(' Exprs ')'
204         ;
205
206 Exprs:
207           Expr ',' Exprs
208         | Expr
209         |
210         ;
211 %%
212
213 extern int yylex();
214 extern int yylineno;
215
216 int yyerror(char *error_text)
217 {
218         fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
219         exit(2);
220 }
221
222 int main(int argc, char **argv)
223 {
224         #if 0
225         yydebug=1;
226         #endif
227         yyparse();
228         return 0;
229 }
230