-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoutAST.py
151 lines (116 loc) · 5.24 KB
/
outAST.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
from SintAsgard import *
def outAST(ast, espacios):
### INSTRUCCIONES ###
# chequeamos para cada instrucción
if isinstance(ast, Asignacion):
print((" "* espacios) + "ASIGNACION")
print((" "* espacios) + f" - var : {ast.var}")
if isinstance(ast.val, Numero) or isinstance(ast.val, Booleano) or isinstance(ast.val, Canvas):
print((" "* espacios) + f" - val : {ast.val.valor}")
else:
print((" "* espacios ) + f" - val: ")
outAST(ast.val, espacios+4)
if isinstance(ast, Secuenciacion):
# Imprimimos el nombre de la instrucción solo la primera vez
if ast.primer_print:
print((" "* espacios) + "SECUENCIACION")
ast.primer_print = False
# Si no está anidado, quiere decir que sus ambas instrucciones
# son distintas de una secuenciación, por lo que las pasamos
# normalmente de manera recursiva
if not ast.anidada:
outAST(ast.ins1, espacios + 4)
outAST(ast.ins2, espacios + 4)
# Si son anidadas, al tener precedencia izquierda, debemos
# iterar sobre la primera instrucción.
# Si es una secuenciación, la pasamos de manera normal sin los
# espacios extra para el orden de la salida
# Si no es una secuenciación, la pasamos de manera normal con
# los espacios correspondientes
# La segunda instrucción nunca puede ser una secuenciación así
# que la imprimimos normalmente
else:
for subnodo, valor in vars(ast.ins1).items():
if isinstance(valor, Secuenciacion):
outAST(valor, espacios)
else:
outAST(valor, espacios+4)
outAST(ast.ins2, espacios + 4)
if isinstance(ast, Condicional):
print((" "* espacios) + ast.tipo.upper())
# guardia del condicional
print((" "* espacios) + " - guardia:")
outAST(ast.guardia, espacios + 6)
# exito del condicional
print((" "* espacios) + " - exito:")
outAST(ast.exito, espacios + 6)
if ast.fracaso is not None:
# exito del condicional
print((" "* espacios) + " - fracaso:")
outAST(ast.fracaso, espacios + 6)
if isinstance(ast, IteracionInd):
print((" "* espacios) + ast.tipo.upper())
# guardia de la iteracion
print((" "* espacios) + " - guardia:")
outAST(ast.guardia, espacios + 6)
# instrucción de la iteracion
print((" "* espacios) + " - exito:")
outAST(ast.instr, espacios + 6)
if isinstance(ast, IteracionDet):
print((" "* espacios) + ast.tipo.upper())
# Valor inicial del rango
print((" "* espacios) + " - Valor Inicial del Rango:")
outAST(ast.arit1, espacios + 6)
# Valor inicial del rango
print((" "* espacios) + " - Valor Final del Rango:")
outAST(ast.arit2, espacios + 6)
# Instrucción de Repetición
print((" "* espacios) + " - Instruccion A Repetir:")
outAST(ast.instr, espacios + 6)
if isinstance(ast, Entrada):
print((" "* espacios) + ast.tipo.upper())
# Nombre del Identificador usado en la entrada
print((" "* espacios) + f" - var: {ast.var}")
if isinstance(ast, Salida):
print((" "* espacios) + ast.tipo.upper())
# Nombre de la expresión impresa en salida
print((" "* espacios) + " - Expresion:")
outAST(ast.expr, espacios + 4)
if isinstance(ast, Incorporacion):
print((" "* espacios) + ast.tipo.upper())
# Instrucciones del Sub programa
print((" "* espacios) + " - Instruccion:")
outAST(ast.instr, espacios + 6)
### EXPRESIONES ###
# Chequeamos para cada expresión
if isinstance(ast, OperacionBinaria):
print((" "* espacios) + "OP BINARIA " + ast.tipo.upper())
# Operacion
print((" "* espacios) + f" - Operación: {ast.operador}")
# Izquierdo
print((" "* espacios) + " - Operador izquierdo:")
outAST(ast.izq, espacios + 6)
# Derecho
print((" "* espacios) + " - Operador derecho:")
outAST(ast.der, espacios + 6)
if isinstance(ast, Numero) or isinstance(ast, Canvas) or isinstance(ast, Booleano):
print((" "* espacios) + f"- val: {ast.valor}")
if isinstance(ast, Variable):
print((" "* espacios) + f"- var: {ast.ident}")
if isinstance(ast, Parentizada):
outAST(ast.interna, espacios)
if isinstance(ast, ExpUnaria):
print((" "* espacios) + f"OP UNARIA " + ast.tipo.upper())
print((" "* espacios) + f" - Operador: '{ast.operador}'")
if isinstance(ast.val, Variable):
print((" "* espacios) + f" - val: {ast.val.ident}")
else:
if not isinstance(ast.val, Parentizada):
if not isinstance(ast.val, ExpUnaria):
print((" "* espacios) + f" - val: {ast.val.valor}")
else:
print((" "* espacios) + " - val:")
outAST(ast.val, espacios + 4)
else:
print((" "* espacios) + " - val:")
outAST(ast.val, espacios + 4)