def __init__(self, ref: str, lst: []): temp = VariableValor.VariableValor(ref) temp.indices(lst) if len(lst) > 0: self.ref = Valor(0, 0) else: self.ref = Valor(temp, 5)
def or_entero(param1: Valor, param2: Valor): from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts tipo_resultante = 0 rst = 0 # Solo Se Pueden Valores Numericos if (param1.tipo == 0): if param2.tipo == 0: # Entero tipo_resultante = 0 if (param1.dar_valor() == 1) or (param2.dar_valor() == 1): rst = 1 else: rst = 0 else: Ts.cargar_error( "Error En || Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En La Operacion || Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) else: Ts.cargar_error( "Error En || Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En La Operacion || Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) return Valor(rst, tipo_resultante)
def diferente(param1: Valor, param2: Valor): tipo_resultante = 0 rst = 0 # Solo Se Pueden Valores Numericos if param1.dar_valor() != param2.dar_valor(): rst = 1 else: rst = 0 return Valor(rst, tipo_resultante)
def mayor_igual(param1: Valor, param2: Valor): tipo_resultante = 0 rst = 0 # Solo Se Pueden Valores Numericos if param1.dar_valor() >= param2.dar_valor(): rst = 1 else: rst = 0 return Valor(rst, tipo_resultante)
def absoluto(param1: Valor): tipo_resultante = 0 rst = 0 #Solo Se Pueden Valores Numericos if (param1.tipo == 0): rst = abs(param1.dar_valor()) tipo_resultante = 0 elif param1.tipo == 1: tipo_resultante = 1 rst = abs(param1.dar_valor()) else: print("Error En La ABS Con Tipos: " + param1.dar_tipo_str()) return Valor(rst, tipo_resultante)
def negar_binario(param1 : Valor): from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts tipo_resultante = 0 rst = 0 #Solo Se Pueden Valores Numericos if(param1.tipo==0): tipo_resultante=param1.tipo rst = ~param1.dar_valor() else: Ts.cargar_error( "Error En Negacion Binario Con Tipos: " + param1.dar_tipo_str() , 0, ((0, 0))) print("Error En La NegacionBinaria Con Tipos: " + param1.dar_tipo_str() ) return Valor(rst, tipo_resultante)
def not_num(param1: Valor): tipo_resultante = 0 rst = 0 from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts #Solo Se Pueden Valores Numericos if (param1.tipo == 0): tipo_resultante = param1.tipo if param1.dar_valor() > 0: rst = 0 else: rst = 1 else: Ts.cargar_error( "Error En La Resta Unaria Con Tipos: " + param1.dar_tipo_str(), 0, ((0, 0))) print("Error En La Resta Unaria Con Tipos: " + param1.dar_tipo_str()) return Valor(rst, tipo_resultante)
def cast_char(param: Valor): tipo_rst = 2 rst = 0 if param.tipo == 0: val_ascii=param.dar_valor() if param.dar_valor() > 255: val_ascii= param.dar_valor() % 256 rst = chr(val_ascii) elif param.tipo == 1: val_ascii = int(param.dar_valor()) if param.dar_valor() > 255: val_ascii = param.dar_valor() % 256 rst = chr(val_ascii) elif param.tipo == 2: rst = "" if param.dar_valor() != "": caracter = param.dar_valor()[0] rst = caracter elif param.tipo == 4: return cast_char(param.primer_elemento()) else: print(" TIPO NO RECONOCIDO CASTEO") return Valor(rst, tipo_rst)
def arreglo_obtener_valor(self, nombre: str, llaves: []): retorno = self.lista_variables.get(nombre, None) if retorno is None: return Valor(0, 0) else: if retorno.tipo == 2: return retorno.cadena_arreglo(llaves, nombre, self) elif retorno.tipo == 4: return retorno.sacar_arreglo(llaves, nombre, self) elif retorno.tipo == 5: return self.arreglo_obtener_valor(retorno.contenido.destino, llaves) else: self.cargar_error( "El Registro " + nombre + " No Se Ha Inicializado", 0, (0, 0))
def read(): tipo_resultante = 2 S = App() (S.getText()) rst = S.leido #input("") # rst = input() x = re.search("^\d+\.\d+$", rst) if x is not None: tipo_resultante = 1 rst = float(rst) else: x = re.search("^\d+$", rst) if x is not None: tipo_resultante = 0 rst = int(rst) print(tipo_resultante) return Valor(rst, tipo_resultante)
def variable_obtener_valor(self, nombre: str): retorno = self.lista_variables.get(nombre, None) if retorno is None: retorno = Valor(0, 0) print("El Registro " + nombre + " No Se Ha Inicializado") self.cargar_error( "El Registro " + nombre + " No Se Ha Inicializado", 0, (0, 0)) return retorno else: if (retorno.tipo == 4): return copy.deepcopy(retorno) if (retorno.tipo == 5): return retorno.contenido.ejecutar() else: return retorno
def arreglo_cambiar_valor(self, nombre: str, llaves: [], vaue: Valor): # Si El Valor Es Una Referencio if vaue.tipo == 5: nombre = vaue.contenido.destino llaves = vaue.contenido.lst retorno = self.lista_variables.get(nombre, None) if retorno is None: self.lista_variables[nombre] = Valor({}, 4) retorno = self.lista_variables.get(nombre, None) retorno.guardar_arreglo(llaves, vaue, nombre, self) else: if retorno.tipo == 2: retorno.guardar_cadena_arreglo(llaves, nombre, self, vaue) elif retorno.tipo == 4: retorno.guardar_arreglo(llaves, vaue, nombre, self) elif retorno.tipo == 5: self.arreglo_cambiar_valor(retorno.contenido.destino, llaves, vaue) else: self.cargar_error( "El Registro 11" + nombre + str(llaves) + " No Se Ha Inicializado", 0, (0, 0))
def cast_int(param: Valor): tipo_rst = 0 rst = 0 if param.tipo == 0: rst = param.dar_valor() elif param.tipo == 1: rst = int(param.dar_valor()) elif param.tipo == 2: rst = 0 if param.dar_valor() != "": caracter = param.dar_valor()[0] rst = ord(caracter) elif param.tipo == 4: return cast_int(param.primer_elemento()) else: print(" TIPO NO RECONOCIDO CASTEO") return Valor(rst, tipo_rst)
def xor_binario(param1: Valor, param2: Valor): from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts tipo_resultante = 0 rst = 0 #Solo Se Pueden Valores Numericos if (param1.tipo == 0): if param2.tipo == 0: #Entero tipo_resultante = 0 rst = param1.dar_valor() ^ param2.dar_valor() else: print("Error En Xor Binario Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) Ts.cargar_error( "Error En Xor Binario Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) else: Ts.cargar_error( "Error En Xor Binario Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En Xor Binario Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) return Valor(rst, tipo_resultante)
def dividir(param1 : Valor, param2 : Valor): tipo_resultante = 0 rst = 0 from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts if param2.dar_valor()==0: Ts.cargar_error( "No se pude dividir entre 0 " , 0, ((0, 0))) print(" No se puede dividir entre 0") return Valor(0, 0) #Solo Se Pueden Valores Numericos if(param1.tipo==0): if param2.tipo==0: #Entero tipo_resultante=0 rst=param1.dar_valor() / param2.dar_valor() elif param2.tipo==1: #Decimal tipo_resultante = 1 rst = param1.dar_valor() / param2.dar_valor() else: Ts.cargar_error( "Error En la division Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) elif param1.tipo==1: if param2.tipo==0: #Decimal tipo_resultante=1 rst=param1.dar_valor() / param2.dar_valor() elif param2.tipo==1: #Decimal tipo_resultante = 1 rst = param1.dar_valor() / param2.dar_valor() else: Ts.cargar_error( "Error En la division Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) else: Ts.cargar_error( "Error En la division Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) return Valor(rst, tipo_resultante)
def shift_izquierda(param1: Valor, param2: Valor): tipo_resultante = 0 rst = 0 from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts #Solo Se Pueden Valores Numericos if (param1.tipo == 0): if param2.tipo == 0: #Entero tipo_resultante = 0 rst = param1.dar_valor() << param2.dar_valor() else: print("Error En shift Izquierda Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) Ts.cargar_error( "Error En Shift Izquierda Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) else: Ts.cargar_error( "Error En Shift Izquierda Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En Shift Izquierda Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) return Valor(rst, tipo_resultante)
def multiplicar(param1 : Valor, param2 : Valor): tipo_resultante = 0 rst = 0 from Contenido.LstInstruccion.ABCInstruccion import Ts global Ts #Solo Se Pueden Valores Numericos if(param1.tipo==0): if param2.tipo==0: #Entero tipo_resultante=0 rst=param1.dar_valor() * param2.dar_valor() elif param2.tipo==1: #Decimal tipo_resultante = 1 rst = param1.dar_valor() * param2.dar_valor() else: Ts.cargar_error( "Error En La Multiplicacion Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En La Multiplicacion Con Tipos: "+param1.dar_tipo_str()+","+param2.dar_tipo_str()) elif param1.tipo==1: if param2.tipo==0: #Decimal tipo_resultante=1 rst=param1.dar_valor() * param2.dar_valor() elif param2.tipo==1: #Decimal tipo_resultante = 1 rst = param1.dar_valor() * param2.dar_valor() else: Ts.cargar_error( "Error En La Multiplicacion Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En La Multiplicacion Con Tipos: "+param1.dar_tipo_str()+","+param2.dar_tipo_str()) else: Ts.cargar_error("Error En La Multiplicacion Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str(), 0, ((0, 0))) print("Error En La Multiplicacion Con Tipos: " + param1.dar_tipo_str() + "," + param2.dar_tipo_str()) return Valor(rst, tipo_resultante)
def array(): return Valor({}, 4)