Spaces:
Running
Running
class GeneradorIntermedio: | |
def __init__(self): | |
self.codigo = [] | |
self.temp_id = 1 | |
def nuevo_temp(self): | |
temp = f"t{self.temp_id}" | |
self.temp_id += 1 | |
return temp | |
def generar(self, ast): | |
for instruccion in ast: | |
self.generar_instruccion(instruccion) | |
return self.codigo | |
def generar_instruccion(self, nodo): | |
tipo = nodo["type"] | |
if tipo == "assign": | |
temp = self.generar_expresion(nodo["value"]) | |
self.codigo.append(f"{nodo['var']} = {temp}") | |
elif tipo == "function": | |
arg = self.generar_expresion(nodo["arg"]) if nodo["arg"] else None | |
if arg: | |
self.codigo.append(f"PARAM {arg}") | |
self.codigo.append(f"CALL {nodo['name']}") | |
elif tipo == "if": | |
cond = self.generar_expresion(nodo["condition"]) | |
etiqueta = self.nueva_etiqueta() | |
self.codigo.append(f"IF NOT {cond} GOTO {etiqueta}") | |
for instr in nodo["body"]: | |
self.generar_instruccion(instr) | |
self.codigo.append(f"{etiqueta}:") | |
elif tipo == "while": | |
inicio = self.nueva_etiqueta() | |
fin = self.nueva_etiqueta() | |
self.codigo.append(f"{inicio}:") | |
cond = self.generar_expresion(nodo["condition"]) | |
self.codigo.append(f"IF NOT {cond} GOTO {fin}") | |
for instr in nodo["body"]: | |
self.generar_instruccion(instr) | |
self.codigo.append(f"GOTO {inicio}") | |
self.codigo.append(f"{fin}:") | |
def generar_expresion(self, expr): | |
tipo = expr["type"] | |
if tipo in ("num", "var", "bool", "string"): | |
return expr["value"] | |
elif tipo == "binop": | |
izq = self.generar_expresion(expr["left"]) | |
der = self.generar_expresion(expr["right"]) | |
temp = self.nuevo_temp() | |
self.codigo.append(f"{temp} = {izq} {expr['op']} {der}") | |
return temp | |
elif tipo == "call": | |
return self.generar_expresion(expr["arg"]) | |
else: | |
temp = self.nuevo_temp() | |
self.codigo.append(f"{temp} = ???") | |
return temp | |
def nueva_etiqueta(self): | |
etiq = f"L{self.temp_id}" | |
self.temp_id += 1 | |
return etiq |