-
Notifications
You must be signed in to change notification settings - Fork 0
/
syntaxique.y
273 lines (221 loc) · 8.52 KB
/
syntaxique.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
%{
#include <stdio.h>
int yylex();
int yyerror();
int nb_ligne=1, Col=1;
char* sauvType;
int processdec=0, loopdec=0,arraydec=0;
%}
%union {
int entier;
char* str;
float reel;
}
%token mc_pgm mc_process mc_loop mc_array mc_var mc_entier mc_real mc_char mc_str mc_const mc_read mc_write <str>IDF <entier>entier <reel>reel chaine car boucw conEG conInf conSup condInforEg condSuporEg conddiff adr mc_execut conddeb condtrai condfin fin dpts sep bib egale aff add multi sous dev accv accf crov crof formIng formReal formStr formChar form parv parf commdeb comfin g gg
%start S
%%
S: LIST_BIB mc_pgm IDF accv DEC_VAR SUITE_INSTS accf {printf("syntaxe correcte");YYACCEPT;}
;
cst: entier
|reel
|parv add entier parf
|parv sous entier parf
|parv add reel parf
|parv sous reel parf
;
cstU : parv add entier parf
|parv sous entier parf
|parv add reel parf
|parv sous reel parf
;
LIST_BIB : LIST_BIB BIB
|
;
BIB: bib NOM_BIB fin
;
NOM_BIB : mc_process {processdec=1;}
| mc_loop {loopdec=1;}
|mc_array {arraydec=1;}
;
DEC_VAR:mc_var LIST_DEC DEC_VAR
|mc_const LIST_CONST DEC_VAR
|
;
LIST_DEC: TYPE dpts SUITE_IDF fin LIST_DEC
|
;
SUITE_IDF: VARDEC sep SUITE_IDF
|VARDEC
;
VARDEC : IDF {if(doubleDeclaration($1)==0)
insererTYPE($1,sauvType);
else
printf("err semantique: double declaration de %s a la ligne %d\n",$1,nb_ligne);
}
|IDF crov cst crof {if(doubleDeclaration($1)==0)
insererTYPE($1,sauvType);
else
printf("err semantique: double declaration de %s a la ligne %d\n",$1,nb_ligne);
if (arraydec==0) printf("err semantique: bibliothèque array non declarée a ligne %d et a la colonne %d: division par 0 \n", nb_ligne,Col);
}
;
LIST_CONST: TYPE dpts SUITE_CONST fin LIST_CONST
|
;
SUITE_CONST : VARDEC aff VAL sep SUITE_CONST
| VARDEC aff VAL
;
VAL : cst
| g chaine g
| gg car gg
;
TYPE:mc_entier
|mc_real
|mc_char
|mc_str
;
SUITE_INSTS: INST SUITE_INSTS
|
;
INST : SUITE_AFF {if (processdec==0) printf("err semantique: bibliothèque process non declarée a ligne %d et a la colonne %d: division par 0 \n", nb_ligne,Col); }
|E
|S
|BOUCLE {if (loopdec==0) printf("err semantique: bibliothèque loop non declarée a ligne %d et a la colonne %d: division par 0 \n", nb_ligne,Col); }
|CONDITION
;
SUITE_AFF:SUITE_AFF AFF fin
|
;
AFF : IDF aff VALAFF {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
VALAFF : IDF {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|VAL
|INSTR
;
INSTR : IDF OP IDF SUITINS {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
if(nonDeclaree($3)==-1)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF OP cst SUITINS {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|cst OP cst SUITINS
|cst OP IDF SUITINS {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF OP IDF {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF OP cst {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|cst OP cst
|cst OP IDF {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|cst
|IDF {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|IDF dev IDF SUITINS {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée aa ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF dev cstU SUITINS {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|IDF dev entier SUITINS {
if ($3==0) printf(" Erreur semantique a ligne %d a la colonne %d: division par 0 \n", nb_ligne,Col);
else printf("la Division de %s par %d \n ", $1,$3);
if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declaréea ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|cst dev cstU SUITINS
|cst dev entier SUITINS {
if ($3==0) printf(" Erreur semantique a ligne %d a la colonne %d: division par 0 \n", nb_ligne,Col);
}
|cst dev IDF SUITINS IDF {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF dev IDF IDF {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$3, nb_ligne,Col);
}
|IDF dev cstU IDF {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|IDF dev entier {if(nonDeclaree($1)!=0)
printf("err semantique: variable %s non declarée a ligne %d et a la colonne %d: division par 0 \n",$1, nb_ligne,Col);
}
|cst dev cstU
|cst dev entier {
if ($3==0) printf(" Erreur semantique a ligne %d et a la colonne %d: division par 0 \n", nb_ligne,Col);
}
|cst dev IDF {if(nonDeclaree($3)!=0)
printf("err semantique: variable %s non declarée a la ligne %d\n",$3,nb_ligne);
}
;
SUITINS : OP INSTR
|dev cst
|dev entier {
if ($2==0) printf(" Erreur semantique a ligne %d et a la colonne %d: division par 0 \n", nb_ligne,Col);
}
|dev IDF
;
OP: add
|multi
|sous
;
E : mc_read parv g SIGF g form adr IDF parf;
SIGF: formIng
| formReal
| formStr
| formChar
;
S: mc_write parv g PHRASE g form liste_IDF parf
;
PHRASE : chaine PHRASE
| chaine
;
liste_IDF : IDF sep liste_IDF
|IDF
;
BOUCLE : boucw COND accv SUITE_INSTS accf fin
;
COND : parv INSTR OPECOMP INSTR parf
;
OPECOMP :conEG
|conInf
|conSup
|condInforEg
|condSuporEg
|conddiff
;
CONDITION : mc_execut INST conddeb COND SUITE condfin fin
;
SUITE:condtrai mc_execut SUITE_INSTS
|
;
%%
int main()
{
initialisation();
yyparse();
afficher();
return 0;
}
int yywrap()
{
return 0;
}
int yyerror(char *msg)
{ printf ("Erreur Syntaxique a ligne %d a colonne %d \n", nb_ligne,Col);
return 1; }