-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterprete_final?
172 lines (153 loc) · 7.24 KB
/
interprete_final?
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
import argparse
import pila
import errores
import sys
import time
ARREGLO_MAX = 30000
class MataCerebros(object):
"......."
def __init__(self,comandos,saltos):
self.cinta = [0]*ARREGLO_MAX
self.cinta_posicion_actual = 0
self.saltos = saltos
self.comandos = comandos
self.comando_actual = 0
def avanzar(self):
if self.cinta_posicion_actual == ARREGLO_MAX:
self.cinta_posicion_actual = 0
return
self.cinta_posicion_actual+=1
def retroceder(self):
if self.cinta_posicion_actual == -ARREGLO_MAX:
self.cinta_posicion_actual = ARREGLO_MAX
return
self.cinta_posicion_actual-=1
def imprimir_actual(self):
sys.stdout.write(chr(self.cinta[self.cinta_posicion_actual]))
sys.stdout.flush()
time.sleep(0.01)
def incrementar(self):
if self.cinta[self.cinta_posicion_actual] == 256:
self.cinta[self.cinta_posicion_actual] = 0
return
self.cinta[self.cinta_posicion_actual]+=1
def decrementar(self):
if self.cinta[self.cinta_posicion_actual] == 0:
self.cinta[self.cinta_posicion_actual] = 256
return
self.cinta[self.cinta_posicion_actual]-=1
def saltar(self,caracter,posicion):
"""......."""
if caracter == "[" and self.cinta[self.cinta_posicion_actual] == 0:
self.comando_actual = self.saltos[posicion]
elif caracter == "]" and self.cinta[self.cinta_posicion_actual] != 0:
self.comando_actual = self.saltos[posicion]
else:
self.comando_actual+=1
def interpretar(self):
dic_funciones = {"<":MataCerebros.retroceder,">":MataCerebros.avanzar,
".":MataCerebros.imprimir_actual,"-":MataCerebros.decrementar,
"+":MataCerebros.incrementar}
while self.comando_actual < len(self.comandos):
if self.comandos[self.comando_actual] == "]" or self.comandos[self.comando_actual] == "[":
MataCerebros.saltar(self,self.comandos[self.comando_actual],self.comando_actual)
else:
dic_funciones[self.comandos[self.comando_actual]](self)
self.comando_actual+=1
class MataCerebros_debug(MataCerebros):
def __init__(self,comandos,saltos):
MataCerebros.__init__(self,comandos,saltos)
self.cantidad_comandos = len(comandos)
self.mensaje_actual = ""
def interpretar_debug(self):
Correr_programa = True
while Correr_programa:
Correr_programa = self.interpretar()
def anadir_caracter(self):
self.mensaje_actual+=(chr(self.cinta[self.cinta_posicion_actual]))
def recortar_cinta(self):
recorte = 5
if self.cinta_posicion_actual == recorte:
return MataCerebros_debug.representar_cinta(self,self.cinta[self.cinta_posicion_actual-recorte:self.cinta_posicion_actual+recorte])
if (self.cinta_posicion_actual < recorte and self.cinta_posicion_actual >= 0) or (self.cinta_posicion_actual < 0 and self.cinta_posicion_actual > -recorte):
return MataCerebros_debug.representar_cinta(self,self.cinta[self.cinta_posicion_actual-recorte-1:-1]+\
self.cinta[0:(recorte*2)+self.cinta_posicion_actual-recorte])
else:
return MataCerebros_debug.representar_cinta(self,self.cinta[self.cinta_posicion_actual-recorte:self.cinta_posicion_actual+recorte])
def representar_cinta(self,lista):
representacion = ""
for x in range(len(lista)):
if x == len(lista)/2:
representacion+=">>"+str(lista[x])+"<<"+"|"
continue
elif x == len(lista)-1:
representacion+=str(lista[x])
else:
representacion+=str(lista[x])+"|"
return representacion
def interpretar(self):
dic_funciones = {"<":MataCerebros.retroceder,">":MataCerebros.avanzar,
".":MataCerebros_debug.anadir_caracter,"-":MataCerebros.decrementar,
"+":MataCerebros.incrementar}
while self.comando_actual < len(self.comandos):
cinta_corte_actual = MataCerebros_debug.recortar_cinta(self)
print "El estado actual de la cinta es: \n",cinta_corte_actual
print "El comando que se ejecutara es: ",self.comandos[self.comando_actual]
print "El mensaje actual es: \n",self.mensaje_actual
raw_input()
if self.comandos[self.comando_actual] == "]" or self.comandos[self.comando_actual] == "[":
MataCerebros.saltar(self,self.comandos[self.comando_actual],self.comando_actual)
else:
dic_funciones[self.comandos[self.comando_actual]](self)
self.comando_actual+=1
def referenciar_saltos(caracter,pila_saltos,pos_actual,dic):
""":................"""
if caracter == "[":
pila_saltos.apilar([caracter,pos_actual])
else:
try:
if pila_saltos.ver_tope()[0] == "[":
pos_anterior = pila_saltos.desapilar()[1]
dic[pos_actual] = pos_anterior
dic[pos_anterior] = pos_actual
except pila.PilaVaciaError:
raise errores.MCSyntaxError
return pila_saltos,dic
def cargar_codigo(archivo):
""" Pre: El archivo debe existir y se tiene que poder leer
Post: Devuelve una lista con los comandos que reconoce
un interprete de matacerebros
"""
with open(archivo) as archivo_matacerebros:
comandos_matacerebro = "<>+-[]."
comandos_archivo = []
dic_saltos = {}
pila_saltos = pila.Pila()
pos_actual = 0
for linea in archivo_matacerebros:
for caracter in linea:
if caracter in comandos_matacerebro:
if caracter == "[" or caracter == "]":
referenciar_saltos(caracter,pila_saltos,pos_actual,dic_saltos)
comandos_archivo.append(caracter)
pos_actual+=1
if pila_saltos.esta_vacia():
return comandos_archivo,dic_saltos
else: raise errores.MCSyntaxError
#Este codigo devuelve la lista de cada comando pero en cada corchete "[" o "]" guarda la posicion del corchete asociado
def main():
parser = argparse.ArgumentParser(description='Interprete de codigo MataCerebros')
parser.add_argument('archivo', metavar='archivo', help='archivo con codigo a interpretar')
parser.add_argument('-d', '--debug', action='store_true', help='modo debug')
args = parser.parse_args()
nombre_archivo = args.archivo #Esto es un string, que vendria a tener
modo_debug = args.debug #si en la linea de comandos le pasas aparte del nombre, "-d", esto guarda True
lista_comandos,saltos = cargar_codigo(nombre_archivo)
if not modo_debug:
interprete = MataCerebros(lista_comandos,saltos)
interprete.interpretar()
return
print "Presione enter luego de que se muestre el desarrollo actual del programa para continuar"
interprete = MataCerebros_debug(lista_comandos,saltos)
interprete.interpretar_debug()
main()