-
Notifications
You must be signed in to change notification settings - Fork 0
/
yacc.y
374 lines (290 loc) · 10.6 KB
/
yacc.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
/* -----------------------------------------------------*/
/* TOKENS */
/* -----------------------------------------------------*/
/* Vide */
%token VIDE
/* Fonctions prédefinies */
%token ECRIRE LIRE
/* Ponctuation */
%token CROCHET_OUVRANT CROCHET_FERMANT
%token VIRGULE POINT_VIRGULE POINT
%token PARENTHESE_OUVRANTE PARENTHESE_FERMANTE
%token DEUX_POINTS
%token POINT_ET_POINT
%token INTERROGATION
/* Constantes */
%token CSTE_ENTIERE
%token CSTE_REELLE
%token CSTE_BOOLEENNE
%token CSTE_CARACTERE
%token CSTE_CHAINE
/* Affectation */
%token OPAFF
/* Variables */
%token IDF
/* Mots clefs */
%token PROG ACC_DEBUT ACC_FIN
%token SI ALORS SINON
%token TANT_QUE POUR FAIRE
%token RETOURNE
%token STRUCT FSTRUCT
%token TABLEAU
%token TYPE
%token DE
%token PROCEDURE FONCTION
%token VARIABLE
%token SWITCH CASE DEFAULT
/* Types */
%token ENTIER REEL BOOLEEN CARACTERE CHAINE
/* Opérateurs */
%token PLUS MOINS MULTIPLICATION DIVISION MODULO
/* Opérateurs binaires */
%token PLUS_ET_PLUS MOINS_ET_MOINS
%token NEGATION
/* Opérateurs raccourcis */
%token PLUS_EGAL MOINS_EGAL MULT_EGAL DIV_EGAL MODULO_EGAL
/* Comparateurs */
%token INFERIEUR
%token SUPERIEUR
%token INFERIEUR_OU_EGAL
%token SUPERIEUR_OU_EGAL
%token EGAL
%token DIFFERENT
%token ET
%token OU
%token START
%%
/* -----------------------------------------------------*/
/* Programme général */
/* -----------------------------------------------------*/
programme: PROG corps
;
corps: liste_declarations START liste_instructions
| START liste_instructions
;
/* -----------------------------------------------------*/
/* Déclarations */
/* -----------------------------------------------------*/
liste_declarations: declaration POINT_VIRGULE
| liste_declarations declaration POINT_VIRGULE
;
declaration: declaration_type
| declaration_variable
| declaration_procedure
| declaration_fonction
;
declaration_type: TYPE IDF DEUX_POINTS suite_declaration_type
;
suite_declaration_type: TABLEAU dimension DE nom_type
| STRUCT liste_champs FSTRUCT
;
/* -----------------------------------------------------*/
/* Déclarations : TABLEAUX */
/* -----------------------------------------------------*/
dimension: CROCHET_OUVRANT liste_dimensions CROCHET_FERMANT
;
liste_dimensions: une_dimension
| liste_dimensions VIRGULE une_dimension
;
une_dimension: expression POINT_ET_POINT expression
;
/* -----------------------------------------------------*/
/* Déclarations : STRUCTURES */
/* -----------------------------------------------------*/
liste_champs: un_champ POINT_VIRGULE
| liste_champs un_champ POINT_VIRGULE
;
un_champ: IDF DEUX_POINTS nom_type
;
/* -----------------------------------------------------*/
/* Déclarations : VARIABLES */
/* -----------------------------------------------------*/
declaration_variable: VARIABLE declaration_suite_variable DEUX_POINTS nom_type
;
declaration_suite_variable: IDF
| declaration_suite_variable VIRGULE IDF
;
/* -----------------------------------------------------*/
/* Déclarations : PROCEDURES/ FONCTIONS */
/* -----------------------------------------------------*/
declaration_procedure: PROCEDURE IDF liste_parametres corps
;
declaration_fonction: FONCTION IDF liste_parametres RETOURNE type_simple corps
;
liste_parametres:
| PARENTHESE_OUVRANTE PARENTHESE_FERMANTE
| PARENTHESE_OUVRANTE liste_param PARENTHESE_FERMANTE
;
liste_param: un_param
| liste_param VIRGULE un_param
;
un_param: IDF DEUX_POINTS nom_type
;
/* -----------------------------------------------------*/
/* Déclarations : TYPES */
/* -----------------------------------------------------*/
nom_type: type_simple
| IDF
;
type_simple: ENTIER
| REEL
| BOOLEEN
| CARACTERE
| CHAINE CROCHET_OUVRANT CSTE_ENTIERE CROCHET_FERMANT /* Chaîne constante */
| CHAINE /* Chaîne a taille variable */
;
/* -----------------------------------------------------*/
/* Instructions */
/* -----------------------------------------------------*/
liste_instructions: ACC_DEBUT suite_liste_inst ACC_FIN
;
suite_liste_inst: instruction
| suite_liste_inst instruction
;
instruction: POINT_VIRGULE
| affectation POINT_VIRGULE
| condition
| tant_que
| pour
| faire_tant_que
| switch
| appel POINT_VIRGULE
| VIDE
| RETOURNE resultat_retourne POINT_VIRGULE
| ECRIRE PARENTHESE_OUVRANTE format suite_ecriture PARENTHESE_FERMANTE POINT_VIRGULE
| LIRE PARENTHESE_OUVRANTE liste_variables PARENTHESE_FERMANTE POINT_VIRGULE
;
/* -----------------------------------------------------*/
/* Affectation */
/* -----------------------------------------------------*/
affectation: variable OPAFF expression /* x = 5 + 3 * 5 + fun(5) ... */
| variable op_bin /* x++; x--; */
| op_bin variable /* ++x; --x; */
| variable OPAFF ternaire /* x = 5 + 6 > 3 ? 10 : 26 */
| variable op_rac expression; /* x += 5; x /= 6 + 9 */
;
op_bin: PLUS_ET_PLUS
| MOINS_ET_MOINS
;
op_rac: PLUS_EGAL
| MOINS_EGAL
| MULT_EGAL
| DIV_EGAL
| MODULO_EGAL
;
variable: IDF suite_variable
;
suite_variable: suite_variable CROCHET_OUVRANT expression CROCHET_FERMANT
| suite_variable POINT IDF
|
;
/* -----------------------------------------------------*/
/* Condition */
/* -----------------------------------------------------*/
condition: SI expression ALORS liste_instructions
| SI expression ALORS liste_instructions SINON liste_instructions
| SI expression ALORS liste_instructions SINON condition
;
/* -----------------------------------------------------*/
/* Tant que/pour/faire tant que */
/* -----------------------------------------------------*/
tant_que: TANT_QUE expression FAIRE liste_instructions
;
pour: POUR pour_cont FAIRE liste_instructions
| POUR PARENTHESE_OUVRANTE pour_cont PARENTHESE_FERMANTE FAIRE liste_instructions
;
pour_cont: pour_a POINT_VIRGULE pour_e POINT_VIRGULE pour_a
;
pour_a: affectation
|
;
pour_e: expression
|
;
faire_tant_que: FAIRE liste_instructions TANT_QUE expression POINT_VIRGULE
;
/* -----------------------------------------------------*/
/* Ternaire */
/* -----------------------------------------------------*/
ternaire: expression INTERROGATION expression DEUX_POINTS expression
;
/* -----------------------------------------------------*/
/* Switch */
/* -----------------------------------------------------*/
switch: SWITCH expression ACC_DEBUT suite_switch default ACC_FIN
;
suite_switch: suite_switch CASE expression DEUX_POINTS liste_instructions
| suite_switch CASE expression DEUX_POINTS instruction
| CASE expression DEUX_POINTS liste_instructions
| CASE expression DEUX_POINTS instruction
;
default: DEFAULT DEUX_POINTS liste_instructions
| DEFAULT DEUX_POINTS instruction
|
;
/* -----------------------------------------------------*/
/* Appel */
/* -----------------------------------------------------*/
appel: IDF liste_arguments
;
liste_arguments: PARENTHESE_OUVRANTE PARENTHESE_FERMANTE
| PARENTHESE_OUVRANTE liste_args PARENTHESE_FERMANTE
;
liste_args: un_arg
| liste_args VIRGULE un_arg
;
un_arg: expression
;
/* -----------------------------------------------------*/
/* WRITE */
/* -----------------------------------------------------*/
format: CSTE_CHAINE
;
suite_ecriture: VIRGULE variable suite_ecriture
|
;
/* -----------------------------------------------------*/
/* READ */
/* -----------------------------------------------------*/
liste_variables: liste_variables VIRGULE variable
| variable
;
/* -----------------------------------------------------*/
/* EXPRESSIONS */
/* -----------------------------------------------------*/
resultat_retourne:
| expression
;
expression: expression PLUS expression2
| expression MOINS expression2
| expression OU expression2
| expression2
| test
;
expression2: expression2 MULTIPLICATION expression3
| expression2 DIVISION expression3
| expression2 MODULO expression3
| expression2 ET expression3
| expression3
;
expression3: PARENTHESE_OUVRANTE expression PARENTHESE_FERMANTE
| CSTE_REELLE
| CSTE_ENTIERE
| CSTE_CARACTERE
| CSTE_BOOLEENNE
| CSTE_CHAINE
| variable
| appel
| PARENTHESE_OUVRANTE affectation PARENTHESE_FERMANTE
| NEGATION expression3 /* Autoriser: !!!5 par exemple */
;
test: expression liste_comparateur expression2
;
liste_comparateur: INFERIEUR
| INFERIEUR_OU_EGAL
| SUPERIEUR
| SUPERIEUR_OU_EGAL
| EGAL
| DIFFERENT
;
%%