def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) nombre_metodo = str(self.nombre) novo.nuevo_codigo_3d(nombre_metodo + ":") if self.nombre == "main": init = "$s0=array();#pila" Tabla.nuevo_codigo_3d(init) init = "$s1=array();#retorno" Tabla.nuevo_codigo_3d(init) init = "$sp=-1;#null ptr" Tabla.nuevo_codigo_3d(init) init = "$ra=-1;#null ptr" Tabla.nuevo_codigo_3d(init) init = "$v=0;#Ptr Retornos" Tabla.nuevo_codigo_3d(init) init = "$s2=array();" Tabla.nuevo_codigo_3d(init) init = "$sp1=-1;" Tabla.nuevo_codigo_3d(init) init = "$s3=array();" Tabla.nuevo_codigo_3d(init) if len(self.param) > 0: self.simular_pop(novo) self.cuerpo.ejecutar_3D(novo) Tabla.ultimo_redundante("goto retornos;")
def ejecutar_3D(self, Tabla: TablaDeSimbolos): if self.paso_break is None: Tabla.nuevo_error("Error Break", "Solo puede usarse en ciclos y switch", 0, self.tupla) return Tabla.nuevo_codigo_3d("goto " + self.paso_break + ";") return "stopu"
def ejecutar_3D(self, Tabla): temp = self.param.ejecutar_3D(Tabla) mi_eti = "out" + str(id(self)) defa = None for cada in self.cuerpo_switch: cada.paso_continue = self.paso_continue cada.paso_break = mi_eti if cada.param is not None: novo = TablaDeSimbolos(Tabla) cada.ejecutar_3D(novo, temp, mi_eti) else: defa = cada novo = TablaDeSimbolos(Tabla) if defa is not None: defa.ejecutar_3D(novo, temp, mi_eti) Tabla.nuevo_codigo_3d(mi_eti + ":")
def ejecutar_3D(self, Tabla:TablaDeSimbolos): novo_tempo=Temporal(None,0,Tabla.nuevo_correlativo()) Tabla.nuevo_codigo_3d(novo_tempo.contenido+" = read();") return novo_tempo
def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) valor_exec = self.param.mi_tempo if valor_exec is None: valor_exec = self.param.ejecutar_3D(novo) if valor_exec.tipo != 0: novo.nuevo_error( "Error De Tipo", "solo se aceptan tipos enteros en la condicional del IF", 0, self.tupla) if self.cuerpo_no is None: self.cuerpo_si.paso_continue = self.paso_continue self.cuerpo_si.paso_break = self.paso_break else: self.cuerpo_si.paso_continue = self.paso_continue self.cuerpo_si.paso_break = self.paso_break self.cuerpo_no.paso_continue = self.paso_continue self.cuerpo_no.paso_break = self.paso_break if self.nombre_padre is None: nombre_if = "label" + str(id(self)) if self.cuerpo_no is None: condicional = "if (!" + valor_exec.temp_str( ) + ") goto out" + nombre_if + " ;" Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_si.ejecutar_3D(novo) condicional = "out" + nombre_if + ": " Tabla.nuevo_codigo_3d(condicional) else: condicional = "if (!" + valor_exec.temp_str( ) + ") goto out" + str(id(self.cuerpo_no)) + " ;" Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_si.ejecutar_3D(novo) condicional = "goto out" + nombre_if + "; " Tabla.nuevo_codigo_3d(condicional) condicional = "out" + str(id(self.cuerpo_no)) + ": " Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_no.nombre_padre = nombre_if self.cuerpo_no.ejecutar_3D(novo) condicional = "out" + nombre_if + ": " Tabla.nuevo_codigo_3d(condicional) else: nombre_if = "label" + str(id(self)) if self.cuerpo_no is None: condicional = "if (!" + valor_exec.temp_str( ) + ") goto out" + self.nombre_padre + " ;" Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_si.ejecutar_3D(novo) else: condicional = "if (!" + valor_exec.temp_str( ) + ") goto out" + str(id(self.cuerpo_no)) + " ;" Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_si.ejecutar_3D(novo) condicional = "goto out" + self.nombre_padre + "; " Tabla.nuevo_codigo_3d(condicional) condicional = "out" + str(id(self.cuerpo_no)) + ": " Tabla.nuevo_codigo_3d(condicional) novo = TablaDeSimbolos(Tabla) self.cuerpo_no.nombre_padre = self.nombre_padre self.cuerpo_no.ejecutar_3D(novo)
def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) for each in self.lst_param: eti_temp=each.ejecutar_3D(novo).temp_str() inst="print( "+eti_temp+" );" novo.nuevo_codigo_3d(inst)
from Contenido.Analizadores.MinorCSintactico import analizar_ascendente from Contenido.TablaDeSimbolos import TablaDeSimbolos #cadena="int x=0; int a=0; do { a=a+x; x=x+1; } while(x<4)" rst=analizar_ascendente(cadena4) tab = TablaDeSimbolos(None) if rst is None : print("Error") #print(rst.str_arbol()); rst.ejecutar_3D(tab) tab.terminar_codigo_3d() from Contenido.Optimo import Optimo Optm:Optimo = Optimo(tab.codigo_3d) lst_sal = Optm.codigo_optimizado() tab.imprimir_codigo_3d(lst_sal) #print(tab.codigo_3d) #tab.imprimir_temporales()
def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) nombre_ciclo = "label" + str(id(self)) novo.nuevo_codigo_3d(nombre_ciclo + ":") valor_exec = self.param.mi_tempo self.cuerpo.paso_continue = nombre_ciclo self.cuerpo.paso_break = "out" + nombre_ciclo self.cuerpo.ejecutar_3D(novo) if valor_exec is None: valor_exec = self.param.ejecutar_3D(novo) if valor_exec.tipo != 0: novo.nuevo_error( "Error De Tipo", "solo se aceptan tipos enteros en la condicional del Do While", 0, self.tupla) condicional = "if (" + valor_exec.temp_str( ) + " != 1) goto out" + nombre_ciclo + " ;" novo.nuevo_codigo_3d(condicional) novo.nuevo_codigo_3d("goto " + nombre_ciclo + ";") novo.nuevo_codigo_3d("out" + nombre_ciclo + ":")
from Contenido.LstInstruccion.Operacion.Logica import Or from Contenido.LstInstruccion.Operacion.Logica import Xor from Contenido.LstInstruccion.Operacion.Comparacion import Diferente from Contenido.LstInstruccion.Operacion.Comparacion import Igual from Contenido.LstInstruccion.Operacion.Comparacion import Mayor from Contenido.LstInstruccion.Operacion.Comparacion import MayorIgual from Contenido.LstInstruccion.Operacion.Comparacion import Menor from Contenido.LstInstruccion.Operacion.Comparacion import MenorIgual from Contenido.LstInstruccion.Operacion.ValorOperacion import Abs from Contenido.LstInstruccion.Operacion.ValorOperacion import Read from Contenido.LstInstruccion.Operacion.ValorOperacion import Array from Contenido.LstInstruccion.Operacion.Cast import INT from Contenido.LstInstruccion.Operacion.Cast import FLOAT from Contenido.LstInstruccion.Operacion.Cast import CHAR Ts = TablaDeSimbolos() print("Nueva Tabla") class Instruccion(ABC): tupla: () = (0, 0) def n_t(self, tupla: ()): self.tupla = tupla def determinar_tipo_funcion(self): return None def __init__(self, *args): pass
def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) lista_temp = [] for each in self.lst_param: tempo: Temporal = each.ejecutar_3D(novo) each.pop_retorno(Tabla, tempo.contenido) param = Temporal(None, tempo.tipo, novo.nuevo_parametro()) inst = param.param_str() + " = " + tempo.temp_str() + ";"; lista_temp.append(inst) lista_temp.append("$sp = $sp + 1;") lista_temp.append("$s0[$sp] = " + param.param_str() + ";") # novo.nuevo_codigo_3d(inst) # novo.nuevo_codigo_3d("$sp = $sp + 1;") # novo.nuevo_codigo_3d("$s0[$sp] = "+param.param_str()+";") # for cada in Tabla.dic_temporales.items(): # novo.nuevo_codigo_3d("$sp = $sp + 1;") # novo.nuevo_codigo_3d("$s0[$sp] = " + str(cada[1].contenido) + ";#push param") # novo.nuevo_codigo_3d("$s0[$sp] = $t2;#push param") novo.push_mi_alcance() for cada in lista_temp: novo.nuevo_codigo_3d(cada) novo.nuevo_codigo_3d("$ra = $ra + 1;") ra = novo.aumentar_retorno() novo.nuevo_codigo_3d("$s1[$ra] = " + str(ra) + " ;") novo.nuevo_codigo_3d("goto " + self.nombre_func + ";") novo.nuevo_codigo_3d("ra" + str(ra) + ":") novo.nuevo_codigo_3d("$ra = $ra - 1;") # for cada in Tabla.dic_temporales.items(): # novo.nuevo_codigo_3d(str(cada[1].contenido) +" = $s0[$sp];#pop param") # novo.nuevo_codigo_3d("$t2 = $s0[$sp];#pop param") # novo.nuevo_codigo_3d("$sp = $sp - 1;") novo.pop_mi_alcance() corre = Tabla.nuevo_parametro() print("Implementar Tipo Del Retorno") Te = Temporal(None, 0, "v" + str(corre + 2)) # Tabla.nuevo_temporal("$v"+str(corre+2),Te) return Te
def ejecutar_3D(self, Tabla): novo = TablaDeSimbolos(Tabla) self.inst_inicio.ejecutar_3D(novo) nombre_ciclo = "label" + str(id(self)) novo.nuevo_codigo_3d(nombre_ciclo + ":") valor_exec = self.comprobador.ejecutar_3D(novo) if valor_exec.tipo != 0: novo.nuevo_error( "Error De Tipo", "solo se aceptan tipos enteros en la condicional del FOR", 0, self.tupla) condicional = "if (" + valor_exec.temp_str( ) + " != 1) goto out" + nombre_ciclo + " ;" novo.nuevo_codigo_3d(condicional) self.cuerpo.paso_continue = nombre_ciclo self.cuerpo.paso_break = "out" + nombre_ciclo sal = self.cuerpo.ejecutar_3D(novo) if self.inst_cada is not None: if sal == "stopc": rest = novo.caso_continue() self.inst_cada.ejecutar_3D(novo) novo.nuevo_codigo_3d(rest) else: self.inst_cada.ejecutar_3D(novo) novo.nuevo_codigo_3d("goto " + nombre_ciclo + ";") novo.nuevo_codigo_3d("out" + nombre_ciclo + ":")
def ejecutar_3D(self, Tabla: TablaDeSimbolos): novo_tempo = Temporal(None, 0, Tabla.nuevo_correlativo()) rst_condi = self.condicion.ejecutar_3D(Tabla) mi_nombre = "label" + str(id(self)) condicion = "if(!" + str( rst_condi.contenido) + ") goto " + mi_nombre + ";" if rst_condi.tipo != 0: Tabla.nuevo_error("error de tipo", "la condicion debe ser de tipo entero", 0, self.tupla) Tabla.nuevo_codigo_3d(condicion) tempo_si = self.val_true.ejecutar_3D(Tabla) condicion = novo_tempo.contenido + "=" + str(tempo_si.contenido) + ";" Tabla.nuevo_codigo_3d(condicion) condicion = "goto out" + mi_nombre + ";" Tabla.nuevo_codigo_3d(condicion) condicion = mi_nombre + ":" Tabla.nuevo_codigo_3d(condicion) tempo_no = self.val_false.ejecutar_3D(Tabla) condicion = novo_tempo.contenido + "=" + str(tempo_no.contenido) + ";" Tabla.nuevo_codigo_3d(condicion) condicion = "out" + mi_nombre + ":" Tabla.nuevo_codigo_3d(condicion) return novo_tempo