-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfase2Yeza.py
373 lines (329 loc) · 9.63 KB
/
fase2Yeza.py
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
#! /usr/bin/python
# UNIVERSIDAD SIMON BOLIVAR
# TRADUCTORES E INTERPRETADORES
# Entrega de FASE 2: PARSER del lenguaje BasicTran
# Autores:
# -Yezabel Rincon 10-11005
# -Javier Medina 12-10400
import ply.yacc as yacc
from fase1 import tokens #Se importan los tokens en el lexer
import re
import codecs
import os
import sys
######################################################
# Definicion de la Gramatica #
######################################################
# Precendencia de operadores en el lenguaje BasicTran
precedence = (
('left', 'TkConjuncion'),
('left', 'TkDisyuncion'),
('right', 'TkNegacion'),
('nonassoc', 'TkIgual', 'TkDesigual'),
('nonassoc', 'TkMayor', 'TkMenor', 'TkMenorIgual', 'TkMayorIgual'),
('left', 'TkSuma', 'TkResta'),
('left', 'TkMult', 'TkDiv', 'TkMod'),
('left', 'TkConcatenacion'),
)
# Regla gramatical para un programa en BasicTran
def p_programa(p):
'''
PROGRAMA : DECLARACION_VARIABLES BLOQUE
| BLOQUE
'''
if (len(p) == 3 ):
p[0] = ("PROGRAMA", p[1],p[2])
else :
p[0] = ("PROGRAMA", p[1])
# Regla gramatical para bloque de un programa en BasicTran
def p_bloque(p):
'''
BLOQUE : TkBegin SECUENCIACION TkEnd
| TkBegin VACIO TkEnd
| TkBegin BLOQUE TkEnd
'''
p[0] = ("BLOQUE", p[2])
# Regla gramatical para declaracion de variables
def p_declaracion_variables(p):
'''
DECLARACION_VARIABLES : TkWith LISTA_DECLARACIONES TkDosPuntos TIPO
'''
p[0] = ("DECLARACION", p[2],p[4])
# Regla gramatical para lista de declaraciones
def p_lista_declaraciones(p):
'''
LISTA_DECLARACIONES : TkVar LISTA_IDENTIFICADORES TkComa LISTA_ASIGNACIONES
| TkVar LISTA_ASIGNACIONES TkComa LISTA_IDENTIFICADORES
| TkVar LISTA_IDENTIFICADORES
| TkVar LISTA_ASIGNACIONES
'''
if (len(p) == 5 ):
p[0] = ("DECLARACION",p[2],p[4])
else :
p[0] = p[2]
# Regla gramatical para identificador
def p_identificador(p):
'''
IDENTIFICADOR : TkId
'''
p[0] = p[1]
# Regla gramatical para lista de identificadores
def p_lista_identificadores(p):
'''
LISTA_IDENTIFICADORES : IDENTIFICADOR
| IDENTIFICADOR TkComa LISTA_IDENTIFICADORES
'''
if (len(p) == 2 ):
p[0] = ("ID", p[1])
else :
p[0] = ("ID", p[1], p[3])
# Regla gramatical para asignacion
def p_asignacion(p):
'''
ASIGNACION : EXPRESION TkAsignacion EXPRESION
'''
p[0] = ("ASIGNACION\n", p[1], p[3])
# Regla gramatical para listas de asignaciones
def p_lista_asignaciones(p):
'''
LISTA_ASIGNACIONES : ASIGNACION
| ASIGNACION TkComa LISTA_ASIGNACIONES
'''
if (len(p) == 3 ):
p[0] = p[1]
else :
p[0] = ("ASIGNACION\n",p[1], p[3])
# Regla gramatical para expresiones
def p_expresion(p):
'''
EXPRESION : TkParAbre EXP_REL TkParCierra
| TkParAbre EXP_ARIT TkParCierra
| TkParAbre EXP_BOOL TkParCierra
| TkParAbre EXP_CAR TkParCierra
| TkParAbre EXP_ARR TkParCierra
| TkParAbre IDENTIFICADOR TkParCierra
| TkParAbre LITERAL TkParCierra
| EXP_ARIT
| EXP_REL
| EXP_BOOL
| EXP_CAR
| EXP_ARR
| IDENTIFICADOR
| LITERAL
'''
if len(p) == 4:
p[0] = ("EXPRESION",p[2])
else:
p[0] = ("EXPRESION",p[1])
# Regla gramatical para terminos validos en BasicTran
def p_termino(p):
'''
TERMINO : LITERAL
| IDENTIFICADOR
| EXP_ARIT
'''
p[0] = ("TERMINO", p[1])
# Regla gramatical para literales
def p_literal(p):
'''
LITERAL : TkNum
| TkCaracter
| TkSaltoLinea
| TkTab
| TkComillaSimple
| TkBarraInversa
'''
p[0] = ("LITERAL", p[1])
# Regla gramatical para expresiones aritmeticas
def p_exp_arit(p):
'''
EXP_ARIT : EXPRESION TkMult EXPRESION
| EXPRESION TkDiv EXPRESION
| EXPRESION TkSuma EXPRESION
| EXPRESION TkResta EXPRESION
| EXPRESION TkMod EXPRESION
'''
#FALTA MENOS UNARIO
if len(p) == 2:
p[0] = p[1]
else:
if p[2] == '+':
p[0] = ("SUMA", p[1], p[3])
elif p[2] == '-':
p[0] = ("RESTA", p[1], p[3])
elif p[2] == '*':
p[0] = ("MULTIPLICACION", p[1], p[3])
elif p[2] == '/':
p[0] = ("DIVISION", p[1], p[3])
elif p[2] == '%':
p[0] = ("MOD", p[1], p[3])
# Regla gramatical para expresiones booleanas
def p_exp_bool(p):
'''
EXP_BOOL : TkTrue
| TkFalse
| EXPRESION TkConjuncion EXPRESION
| EXPRESION TkDisyuncion EXPRESION
| TkNegacion EXPRESION
| EXP_REL
'''
if len(p) == 2:
p[0] = ("BOOL",p[1])
elif len(p) == 4:
if p[2] == "\/":
p[0] = ("DISYUNCION" , p[1], p[3])
else:
p[0] = ("CONJUNCION" , p[1], p[3])
# Regla gramatical para expresiones con caracteres
def p_exp_car(p):
'''
EXP_CAR : TkSiguienteCar
| TkAnteriorCar
| TkValorAscci
'''
p[0] = ("EXPRESION CARACTER",p[2])
# Regla gramatical para expresiones con arreglos
def p_exp_arr(p):
'''
EXP_ARR : TkConcatenacion
| TkShift
| INDEXACION
'''
p[0] = ("EXPRESION ARREGLO",p[1])
# Regla gramatical para la indexacion
def p_indexacion(p):
'''
INDEXACION : TkCorcheteAbre TkInt TkCorcheteCierra
'''
p[0] = ("INDEXACION", p[2])
# Regla gramatical para expresiones relacionales
def p_exp_rel(p):
'''
EXP_REL : EXPRESION TkMenor EXPRESION
| EXPRESION TkMayor EXPRESION
| EXPRESION TkMenorIgual EXPRESION
| EXPRESION TkMayorIgual EXPRESION
| EXPRESION TkIgual EXPRESION
| EXPRESION TkDesigual EXPRESION
'''
if p[2] == '<':
p[0] = ("MENOR", p[1], p[3])
elif p[2] == '>':
p[0] = ("MAYOR", p[1], p[3])
elif p[2] == '<=':
p[0] = ("MENOR IGUAL", p[1], p[3])
elif p[2] == '>=':
p[0] = ("MAYOR IGUAL", p[1], p[3])
elif p[2] == '=':
p[0] = ("IGUAL", p[1], p[3])
elif p[2] == '/=':
p[0] = ("DIFERENTE", p[1], p[3])
# Regla gramatical para los tipos de datos
def p_tipo(p):
'''
TIPO : TkInt
| TkBool
| TkChar
| ARREGLO
'''
p[0] = ("TIPO", p[1])
# Regla gramatical para los arreglos
def p_arreglo(p):
'''
ARREGLO : TkArray TkCorcheteAbre TkInt TkCorcheteCierra TkOf TIPO
'''
p[0] = ("ARREGLO",p[3],p[5],p[6])
# Regla gramatical para las diversas instrucciones validas en BasicTran
def p_instruccion(p):
'''
INSTRUCCION : ASIGNACION TkPuntoYComa
| SECUENCIACION TkPuntoYComa
| CONDICION
| ITERACION_I
| ITERACION_D
| ENTRADA TkPuntoYComa
| SALIDA TkPuntoYComa
'''
p[0] = ("INSTRUCCION",p[1])
# Regla gramatical para instruccion de condicional
def p_condicion(p):
'''
CONDICION : TkIf EXPRESION TkHacer INSTRUCCION TkEnd
| TkIf EXPRESION TkHacer INSTRUCCION TkOtherwise TkHacer INSTRUCCION TkEnd
'''
if len(p) == 6:
p[0] = ("IF",p[2],p[4])
else:
p[0] = ("IF",p[2],p[4],p[7])
# Regla gramatical para instruccion iteracion indeterminada
def p_iteracion_i(p):
'''
ITERACION_I : TkWhile EXP_BOOL TkHacer INSTRUCCION TkEnd
'''
p[0] = ("WHILE",p[2],p[4])
# Regla gramatical para instruccion iteracion determinada
def p_iteracion_d(p):
'''
ITERACION_D : TkFor IDENTIFICADOR TkFrom TERMINO TkTo TERMINO TkHacer INSTRUCCION TkEnd
| TkFor IDENTIFICADOR TkFrom TERMINO TkTo TERMINO TkStep TERMINO TkHacer INSTRUCCION TkEnd
'''
if len(p) == 10:
p[0] = ("For",p[2],p[4],p[6],p[8])
else:
p[0] = ("For",p[2],p[4],p[6],p[8], p[10])
# Regla gramatical para instruccion de salida (input)
def p_entrada(p):
'''
ENTRADA : TkRead IDENTIFICADOR
'''
p[0] = ("Entrada",p[2])
# Regla gramatical para instruccion de salida (output)
def p_salida(p):
'''
SALIDA : TkPrint EXPRESION
'''
p[0] = ("Salida",p[2])
# Regla gramatical para instruccion secuenciacion
def p_secuenciacion(p):
'''
SECUENCIACION : INSTRUCCION
| INSTRUCCION SECUENCIACION
'''
if (len(p) == 4 ):
p[0] = ("SECUENCIACION", p[1],p[3])
else :
p[0] = ("SECUENCIACION", p[1])
# Regla para deteccion de errores de sintaxis
def p_error(p):
print("Se ha encontrado un error")
# Regla para lambda
def p_vacio(p):
'''
VACIO :
'''
p[0] = None
#############################################################################
# Metodo auxiliar para la impresion del arbol abstracto en formato solicitado
def listar (result,a):
for n in result:
if isinstance(n,tuple):
listar(n,a)
else:
print( "{} {}".format(a ,n) )
a=a+a
#############################################################################
# Construccion del Parser
parser = yacc.yacc()
############################################################################
# MAIN #
############################################################################
if __name__=="__main__":
#Lectura del archivo de entrada
file = open(sys.argv[1] , "r")
file = file.read()
result = parser.parse(file)
print("Impresion del parser: ")
print(result)
print(' \n' +"Impresion en formato solicitado:"+'\n')
a = ' '
listar(result,a)