-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab02_benavides_escolar_medina.y
308 lines (260 loc) · 5.35 KB
/
lab02_benavides_escolar_medina.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
%{
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
extern FILE * yyin;
extern FILE * yyout;
extern int yylineno;
extern int error;
extern char *yytext;
int errores = 0;
int erroractual = 0;
void yyerror(const char *s);
%}
%locations
%token AND
%token BREAK
%token CONTINUE
%token DEF
%token ELIF
%token ELSE
%token FOR
%token IF
%token IMPORT
%token FROM
%token AS
%token IN
%token IS
%token NOT
%token OR
%token PASS
%token PRINT
%token RETURN
%token WHILE
%token RANGE
%token LEN
%token OP_MAS
%token OP_MENOS
%token OP_MULT
%token OP_EXP
%token OP_DIV
%token OP_DIVENT
%token OP_MOD
%token OP_LSHIFT
%token OP_RSHIFT
%token OP_BITAND
%token OP_OR
%token OP_BITXOR
%token OP_BITNOT
%token OP_MENORQUE
%token OP_MARYORQUE
%token OP_MENORIGUAL
%token OP_MAYORiGUAL
%token OP_IGUALQUE
%token OP_DIFERENTEDE
%token OP_DIFERENTEQUE
%token PARABRE
%token PARCIERRA
%token CORABRE
%token CORCIERRA
%token ASIGNACION
%token PUNTOCOMA
%token COMA
%token DOSPUNTOS
%token PUNTO
%token RSHIFTASIG
%token LSHIFTASIG
%token SUMAASIG
%token RESTAASIG
%token MULTASIG
%token DIVASIG
%token DIVENTASIG
%token BITANDASIG
%token BITORASIG
%token BITXORASIG
%token POTEASIG
%token MODASIG
%token BOOLEANO
%token STRING
%token NUMERO_L
%token ENTERO
%token IDENTIFICADOR
%token ERROR
%token NEWLINE
%start INICIO
%%
NUMERO: NUMERO_L | ENTERO;
NUEVALINEA:
NEWLINE
|;
INICIO: LINEA NUEVALINEA| INICIO LINEA NUEVALINEA;
LINEA: OPERACION
|LINE_ASIGNACION
|CICLO
|EXPRESION
|EXPRESIONBOOLEANA
|LINEAPRINT
|LINEAFUNCION
|CONDICIONALIF
|BREAK
|PASS
|CONTINUE
|IMPORTAR
|RETORNAR
|error {yyerrok;yyclearin;}
|VALORARRRAY
|;
VALORARRRAY:
IDENTIFICADOR CORABRE IDENTIFICADOR CORCIERRA
|VALORARRRAY CORABRE IDENTIFICADOR CORCIERRA
|IDENTIFICADOR CORABRE ENTERO CORCIERRA
|VALORARRRAY CORABRE ENTERO CORCIERRA
|IDENTIFICADOR CORABRE EXPRLEN CORCIERRA
|VALORARRRAY CORABRE EXPRLEN CORCIERRA
|IDENTIFICADOR CORABRE VALORARRRAY CORCIERRA
;
RETORNAR:
RETURN
|RETURN EXPRESION;
LINEAFUNCION: DEF IDENTIFICADOR PARABRE PARAMETROSFUNCION PARCIERRA DOSPUNTOS;
PARAMETROSFUNCION:
|ARGUMENTOSFUNCIONSINASIGNAR
|ARGUMENTOSFUNCIONASIGNADO
|OP_MULT IDENTIFICADOR
|OP_MULT OP_MULT IDENTIFICADOR;
ARGUMENTOSFUNCIONSINASIGNAR:
IDENTIFICADOR COMA
|IDENTIFICADOR
|IDENTIFICADOR COMA ARGUMENTOSFUNCIONSINASIGNAR;
ARGUMENTOSFUNCIONASIGNADO:
IDENTIFICADOR ASIGNACION EXPRESION COMA
|IDENTIFICADOR ASIGNACION EXPRESION
|IDENTIFICADOR ASIGNACION EXPRESION COMA ARGUMENTOSFUNCIONSINASIGNAR;
LINEAPRINT: PRINT PARABRE EXPRESION PARCIERRA
|PRINT PARABRE INE PARCIERRA;
OPERACION : OBJETO OPERADOR OBJETO
|OPERACION OPERADOR OPERACION
|PARABRE OPERACION PARCIERRA
|OPERACION OPERADOR OBJETO
|OBJETO OPERADOR OPERACION;
OPERADOR: OP_MAS
|OP_MENOS
|OP_MULT
|OP_EXP
|OP_DIV
|OP_DIVENT
|OP_MOD
|OP_LSHIFT
|OP_RSHIFT
|OP_BITAND
|OP_OR
|OP_BITXOR
|OP_BITNOT
|OP_MENORQUE
|OP_MARYORQUE
|OP_MENORIGUAL
|OP_MAYORiGUAL
|OP_IGUALQUE
|OP_DIFERENTEDE
|OP_DIFERENTEQUE;
LINE_ASIGNACION: IDENTIFICADOR ASIGNACION EXPRESION;
EXPRESION:
PARABRE EXPRESION PARCIERRA
|OPERACION
|IDENTIFICADOR
|NUMERO
|BOOLEANO
|STRING
|ARRAY
|EXPRESIONBOOLEANA
|EXPRLEN;
EXPRLEN: LEN PARABRE OBJETOEXPRLEN PARCIERRA;
OBJETOEXPRLEN:
IDENTIFICADOR
|STRING
|ARRAY
|VALORARRRAY;
ARRAY: CORABRE INTERIORARRAY CORCIERRA;
INTERIORARRAY: OBJETO | INTERIORARRAY COMA OBJETO | ;
OBJETO:
IDENTIFICADOR
|NUMERO
|STRING
|BOOLEANO
|ARRAY
|VALORARRRAY;
CICLO: CICLOFOR | CICLOWHILE;
CICLOFOR: FOR IDENTIFICADOR IN IDENTIFICADOR DOSPUNTOS
|FOR IDENTIFICADOR IN ARRAY DOSPUNTOS
|FOR IDENTIFICADOR IN RANGE PARABRE INTERIORRANGE PARCIERRA DOSPUNTOS;
INTERIORRANGE:
VARIABLEINRANGE COMA VARIABLEINRANGE COMA VARIABLEINRANGE
|VARIABLEINRANGE COMA VARIABLEINRANGE COMA VARIABLEINRANGE COMA
|VARIABLEINRANGE COMA VARIABLEINRANGE
|VARIABLEINRANGE COMA VARIABLEINRANGE COMA
|VARIABLEINRANGE
|VARIABLEINRANGE COMA
|EXPRLEN;
IMPORTAR:
IMPORT IDENTIFICADOR
|IMPORT IDENTIFICADOR FROM IDENTIFICADOR
|IMPORT IDENTIFICADOR AS IDENTIFICADOR
|IMPORT IDENTIFICADOR FROM IDENTIFICADOR AS IDENTIFICADOR;
VARIABLEINRANGE:
ENTERO
|IDENTIFICADOR;
CICLOWHILE: WHILE EXPRESIONBOOLEANA DOSPUNTOS;
EXPRESIONBOOLEANA:
OPERACIONBOOLENA
|OPERACIONBOOLENA AND EXPRESIONBOOLEANA
|OPERACIONBOOLENA OR EXPRESIONBOOLEANA
;
OPERACIONBOOLENA:
OBJETO
| OBJETO OPERADORBOOLEANO OBJETO
;
OPERADORBOOLEANO:
OP_IGUALQUE
|OP_DIFERENTEDE
|OP_DIFERENTEQUE
|OP_MENORQUE
|OP_MENORIGUAL
|OP_MAYORiGUAL
|OP_MARYORQUE;
CONDICIONALIF:
IF BOOLEANO DOSPUNTOS
|IF PARABRE BOOLEANO PARCIERRA DOSPUNTOS
|IF EXPRESIONBOOLEANA DOSPUNTOS
|IF PARABRE EXPRESIONBOOLEANA PARCIERRA DOSPUNTOS;
INE:
OBJETO IN ARRAY
|OBJETO IN IDENTIFICADOR
|STRING IN STRING;
%%
void yyerror(const char *s) {
if (erroractual != yylineno){
fprintf(yyout,"Error | Linea: %d %s\n",yylineno,s);
fprintf(stderr,"Error | Linea: %d %s\n",yylineno,s);
erroractual = yylineno;
}
errores++;
}
int main(int argc, char *argv[]){
if (argc == 2){
yyin = fopen (argv[1], "r");
yyout=fopen("salida.txt","w");
if (yyin == NULL) {
printf ("El fichero %s no se puede abrir\n", argv[1]);
exit (-1);
}else{
while(!feof(yyin)){
yyparse();
}
if(errores==0){
fprintf(yyout, "No hubo ningun error sintactico.");
fprintf(stderr, "No hubo ningun error sintactico.\n");
}
}
}
}