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