def simular_pop(self, novo): for cada in reversed(self.param): temp = Temporal(None, self.dar_tipo(cada[0]), novo.nuevo_correlativo()) mi_expresion = temp.temp_str() + "= $s0[$sp];#pop " novo.nuevo_codigo_3d(mi_expresion) mi_expresion = "$sp= $sp-1;" novo.nuevo_codigo_3d(mi_expresion) novo.nuevo_temporal(cada[1], temp)
def ejecutar_3D(self, Tabla ): if len(self.corche) != 0: return self.ejecutar_arreglo(Tabla) valor_exec = None if self.valor is None: valor_exec = Temporal(0,0) else: valor_exec = self.valor.mi_tempo if valor_exec is None: valor_exec = self.valor.ejecutar_3D(Tabla) self.valor.pop_retorno(Tabla,valor_exec.contenido) if self.tipo != valor_exec.tipo and (self.union(self.tipo,valor_exec.tipo)==False): desc="Asignacion a una variable de tipo: "+self.tipo_a_str(self.tipo)+" un valor de tipo: "+self.tipo_a_str(valor_exec.tipo) Tabla.nuevo_error("Eror De Tipos",desc,0,self.tupla) ver_tipo = valor_exec.tipo for cada in self.nombre: temp = Temporal(None, ver_tipo, correlativo=Tabla.nuevo_correlativo()) mi_expresion = temp.temp_str() + "= 0;" if self.nombre[-1] == cada: mi_expresion = temp.temp_str() + "=" + valor_exec.temp_str() + ";" rst = Tabla.reemplazar_ultimo_codigo_3d(valor_exec.temp_str(), temp.temp_str()) if rst is None: Tabla.nuevo_codigo_3d(mi_expresion) #Tabla.nuevo_codigo_3d(mi_expresion) Tabla.nuevo_temporal(cada, temp , self.tupla)
def ejecutar_3D(self, Tabla): exec_iz = self.operador_izquierdo.ejecutar_3D(Tabla) exec_de = self.operador_derecho.ejecutar_3D(Tabla) self.operador_izquierdo.pop_retorno(Tabla, exec_iz.temp_str()) self.operador_derecho.pop_retorno(Tabla, exec_de.temp_str()) ver_tipo = self.mi_tipo_ope(exec_iz, self.operando, exec_de, Tabla) temp = Temporal(None, ver_tipo, correlativo=Tabla.nuevo_correlativo()) mi_expresion = temp.temp_str() + "=" + exec_iz.temp_str( ) + self.operando + exec_de.temp_str() + ";" Tabla.nuevo_codigo_3d(mi_expresion) self.mi_tempo = temp return temp
def ejecutar_arreglo(self,Tabla): lista_val = [] for cor in self.corche: tem=cor.ejecutar_3D(Tabla); if tem.tipo != 0: desc = "Los indices de los arreglos solo pueden ser enteros" Tabla.nuevo_error("Eror De Tipos", desc, 0, self.tupla) return lista_val.append(tem) temp = Temporal(None, self.tipo+3, correlativo=Tabla.nuevo_correlativo()) temp.lista_corchetes=lista_val mi_expresion = temp.temp_str() + "=" + " array();" Tabla.nuevo_codigo_3d(mi_expresion) Tabla.nuevo_temporal(self.nombre[0], temp,self.tupla) self.ejecutar_arreglo_con_valor(Tabla,temp)
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
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_arreglo(self, Tabla): concat = "" for cor in self.corche: tem = cor.ejecutar_3D(Tabla) if tem.tipo != 0: desc = "Los indices de los arreglos solo pueden ser enteros" Tabla.nuevo_error("Eror De Tipos", desc, 0, self.tupla) return Temporal(0, 0) concat = concat + "[" + str(tem.contenido) + "]" vari = Tabla.buscar_temporal(self.nombre, self.tupla, None) if vari is None: self.tipo = 0 return Temporal(0, 0) else: self.tipo = vari.tipo varre = Temporal(0, 0) if vari.tipo == 3 or vari.tipo == 4 or vari.tipo == 5: varre.tipo = vari.tipo - 3 else: varre.tipo = vari.tipo varre.contenido = vari.contenido + concat return varre
def ejecutar_3D(self, Tabla): exec_op = self.operacion_unica.ejecutar_3D(Tabla) ver_tipo = self.mi_tipo_ope(self.operando, exec_op, Tabla) temp = Temporal(None, ver_tipo, correlativo=Tabla.nuevo_correlativo()) self.operacion_unica.pop_retorno(Tabla, exec_op.temp_str()) tmp_op = "" if self.operando != "+": tmp_op = self.operando mi_expresion = temp.temp_str() + "=" + tmp_op + exec_op.temp_str( ) + ";" Tabla.nuevo_codigo_3d(mi_expresion) if self.operando == "&": temp.ref = True self.mi_tempo = temp return temp
def ejecutar_3D(self, Tabla): if len(self.corche) != 0: return self.ejecutar_arreglo(Tabla) vari = Tabla.buscar_temporal(self.nombre, self.tupla, None) if vari is None: self.tipo = 0 return Temporal(0, 0) else: self.tipo = vari.tipo return vari
def ejecutar_3D(self, Tabla): vari = Tabla.buscar_temporal(self.nombre, self.tupla, None) if vari is not None: if self.operando == "++": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " + 1;") else: Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " - 1;") else: titu = "Variable: '" + self.nombre + " Encontrada " desc = "no se puede incrementar o decrementar si no esta definida la variable" Tabla.nuevo_error(titu, desc, 0, self.tupla) vari = Temporal(0, 0) return vari
def ejecutar_3D(self, Tabla: TablaDeSimbolos): novo_tempo = Temporal(None, 0, Tabla.nuevo_correlativo()) tama = 20 mid = self.tipo_fijo if self.tipo_fijo is None: execu = self.expre.ejecutar_3D(Tabla) mid = execu.tipo if mid == 1: tama = 8 elif mid == 2: tama = 1 elif mid == 0: tama = 4 else: tama = 20 Tabla.nuevo_codigo_3d(novo_tempo.contenido + " = " + str(tama) + ";") return novo_tempo
def ejecutar_3D(self, Tabla: TablaDeSimbolos): novo_tempo = Temporal(None, 0, Tabla.nuevo_correlativo()) dot_exe = self.expre.ejecutar_3D(Tabla) sub_str: str = self.nombre if sub_str.find("double") != -1: sub_str = "(float)" novo_tempo.tipo = 1 elif sub_str.find("float") != -1: novo_tempo.tipo = 1 elif sub_str.find("int") != -1: novo_tempo.tipo = 0 elif sub_str.find("char") != -1: novo_tempo.tipo = 2 Tabla.nuevo_codigo_3d(novo_tempo.contenido + "=" + sub_str + str(dot_exe.contenido) + ";") return novo_tempo
def ejecutar_3D(self, Tabla): concat = "" for cor in self.corche: tem = cor.ejecutar_3D(Tabla) if tem.tipo != 0: desc = "Los indices de los arreglos solo pueden ser enteros" Tabla.nuevo_error("Eror De Tipos", desc, 0, self.tupla) return Temporal(0, 0) concat = concat + "[" + str(tem.contenido) + "]" valor_exec = self.valor.mi_tempo if valor_exec is None: valor_exec = self.valor.ejecutar_3D(Tabla) vari = Tabla.buscar_temporal(self.nombre, self.tupla, None) if vari is not None: if not Tabla.struct_busqueda_atributo(vari.tipo, self.contenido, self.tupla): return resg = vari.contenido vari.contenido = vari.contenido + concat + "[\"" + self.contenido + "\"]" # temp = vari # mi_expresion = temp.temp_str() + "=" + valor_exec.temp_str() + ";" if self.tipo_asignacion == "+=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " + " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "-=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " - " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "*=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " * " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "/=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " / " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "%=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " % " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "<<=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " << " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == ">>=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " >> " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "&=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " & " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "^=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " ^ " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "|=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " | " + str(valor_exec.contenido) + ";") else: rst = Tabla.reemplazar_ultimo_codigo_3d( valor_exec.temp_str(), vari.temp_str()) if rst is None: mi_expresion = vari.contenido + " = " + valor_exec.temp_str( ) + ";" Tabla.nuevo_codigo_3d(mi_expresion) vari.contenido = resg
def ejecutar_3D(self, Tabla): valor_exec = self.valor.mi_tempo if valor_exec is None: valor_exec = self.valor.ejecutar_3D(Tabla) for cada in self.nombre: vari = Tabla.buscar_temporal(cada, self.tupla, None) if vari is not None: k_tipo = vari.tipo if k_tipo == 3 or k_tipo == 4 or k_tipo == 5: k_tipo = k_tipo - 3 if k_tipo != valor_exec.tipo: #if vari.tipo ==1 and valor_exec.tipo==0: # pass #else: desc = "Asignacion a una variable de tipo: " + self.tipo_a_str( vari.tipo) + " un valor de tipo: " + self.tipo_a_str( valor_exec.tipo) Tabla.nuevo_error("Eror De Tipos", desc, 0, self.tupla) aux = vari.contenido # concat="" # for cada_cosa in self.corche: # val=cada_cosa.ejecutar_3D(Tabla) # concat = "["+str(val.contenido)+"]" concat = "" for cor in self.corche: tem = cor.ejecutar_3D(Tabla) if tem.tipo != 0: desc = "Los indices de los arreglos solo pueden ser enteros" Tabla.nuevo_error("Eror De Tipos", desc, 0, self.tupla) return Temporal(0, 0) concat = concat + "[" + str(tem.contenido) + "]" vari.contenido = vari.contenido + concat # temp = vari # mi_expresion = temp.temp_str() + "=" + valor_exec.temp_str() + ";" if self.tipo_asignacion == "+=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " + " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "-=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " - " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "*=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " * " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "/=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " / " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "%=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " % " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "<<=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " << " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == ">>=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " >> " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "&=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " & " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "^=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " ^ " + str(valor_exec.contenido) + ";") elif self.tipo_asignacion == "|=": Tabla.nuevo_codigo_3d(vari.contenido + " = " + vari.contenido + " | " + str(valor_exec.contenido) + ";") else: rst = None rst = Tabla.reemplazar_ultimo_codigo_3d( valor_exec.temp_str(), vari.temp_str()) if rst is None: mi_expresion = vari.contenido + " = " + valor_exec.temp_str( ) + ";" Tabla.nuevo_codigo_3d(mi_expresion) vari.contenido = aux
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