def ejecutar(self, tsglobal, ts, consola, exceptions): try: if self.caso == 1: resultado = Expresion.Resolver(self.e_if, ts, consola, exceptions) if resultado == True: for x in range(0, len(self.s_if)): self.procesar_instrucciones(self.s_if[x], ts, consola, exceptions, tsglobal) else: pass elif self.caso == 2: print('hola') else: resultado = Expresion.Resolver(self.e_if, ts, consola, exceptions) if resultado == True: for x in range(0, len(self.s_if)): self.procesar_instrucciones(self.s_if[x], ts, consola, exceptions, tsglobal) else: for x in range(0, len(self.s_else)): self.procesar_instrucciones(self.s_else[x], ts, consola, exceptions, tsglobal) except: consola.append("XX000 : internal_error")
def WhereUp(where, tabla, campos, ts, consola, exceptions, updateinst) -> list: if isinstance(where, Expresion): if isinstance(where.iz, Id): ix = 0 #el indice del campo a filtar bandera = False for c in campos: if c == where.iz.id: bandera = True break ix = ix + 1 expre = Expresion.Resolver(where.dr, ts, consola, exceptions) if bandera: tf = Filtrar(tabla, ix, where.operador, expre) return tf else: consola.append( f"La tabla {updateinst.id} no puede actualizarse, el campo no existe\n" ) exceptions.append( f"Error semantico-42P01- 42P01 undefined_table, el campo no existe -{updateinst.fila}-{updateinst.columna}" ) return [] ##------------ elif where.operador == 'or' or where.operador == 'and': tf1 = [] tf2 = [] if isinstance(where.iz, Expresion): tf1 = WhereUp(where.iz, tabla, campos, ts, consola, exceptions, updateinst) if isinstance(where.dr, Expresion): tf2 = WhereUp(where.dr, tabla, campos, ts, consola, exceptions, updateinst) if where.operador == 'and': tabla = AndManual(tf1, tf2) return tabla elif where.operador == 'or': if len(tf1) != 0 and len(tf2) != 0: tabla = tf1 + tf2 return tabla else: return [] else: consola.append( f"La tabla {updateinst.id} no puede actualizarse, el campo no existe\n" ) exceptions.append( f"Error semantico-42P01- 42P01 undefined_table, el campo no existe -{updateinst.fila}-{updateinst.columna}" ) return [] else: consola.append( f"La tabla {updateinst.id} no puede actualizarse, where no contemplado semanticamente\n" ) exceptions.append( f"Error semantico-42P01- 42P01 undefined_table, where no contemplado semanticamente -{updateinst.fila}-{updateinst.columna}" ) return []
def Resolver(IdAsId, ts, Consola, exceptions): if (isinstance(IdAsId.id1, Time)): valor = Time.resolverTime(IdAsId.id1) return valor elif (isinstance(IdAsId.id1, Math_)): valor = Math_.Resolver(IdAsId.id1, ts, Consola, exceptions) return str(valor) elif (isinstance(IdAsId.id1, Trigonometrica)): valor = Trigonometrica.Resolver(IdAsId.id1, ts, Consola, exceptions) return valor elif (isinstance(IdAsId.id1, Primitivo)): valor = IdAsId.id1.valor return valor elif (isinstance(IdAsId.id1, Id)): valor = IdAsId.id1.id return valor elif (isinstance(IdAsId.id1, IdId)): valor1 = IdAsId.id1.id1 valor2 = IdAsId.id1.id2 return [valor1, valor2] elif isinstance(IdAsId.id1, Expresion): return Expresion.Resolver(IdAsId.id1, ts, Consola, exceptions) return 'what -- ' + type(IdAsId.id1).__name__ + '\n'
def ejecutarDeclaracion(declaracion,simboloFuncion,ts,consola,exception): entornoFN = simboloFuncion.Entorno nuevosimbolo = None if declaracion.asignacion == None: nuevosimbolo = TS.Simbolo(TS.TIPO_DATO.DECLARE, declaracion.id, declaracion.tipo, None, None) else: expre = Expresion.Resolver(declaracion.asignacion,ts,consola,exception) nuevosimbolo = TS.Simbolo(TS.TIPO_DATO.DECLARE, declaracion.id, declaracion.tipo, expre, None) entornoFN.agregar_sim(nuevosimbolo)
def comprobarcheck(expresion, data, valor, nombre_columna, ts, Consola, exception): valor_retorno = True print("que pedo", data) #if data == 1: print("-> ", expresion) if expresion != None: for datos in expresion: dataiz = datos.iz datade = datos.dr operador = datos.operador if nombre_columna != dataiz.id: valor_retorno = False break valor_retorno = Expresion.Resolver( Expresion(Primitivo(valor, 1, 1), datade, operador, 1, 1), ts, Consola, exception) return valor_retorno
def Expre(expre, consola, ts, exceptions): res = 0 if isinstance(expre, Primitivo): res = expre.valor ##print('es primitivo ' + str(res)) elif isinstance(expre, Id): ##print('es id error semantico') res = None elif isinstance(expre, Time): res = Time.resolverTime(expre) else: ##print('es expresion') res = Expresion.Resolver(expre, ts, consola, exceptions) ##print(str(res)) return res
def ejecutar(createType,ts,consola,exceptions): if ts.validar_sim(createType.id) == -1: datavalidada = [] for data in createType.lista: resultado = Expresion.Resolver(data,ts,consola,exceptions) datavalidada.append(resultado) nuevo_tipo = TS.Simbolo(TS.TIPO_DATO.CLASEENUMERADA, createType.id, "Enum", datavalidada, None) ts.agregar_sim(nuevo_tipo) consola.append(f"Se añadio una clase enum llamada {createType.id}") else: consola.append(f"Ya existe esta clase enumerada")
def asignarArgumentos(simboloFuncion,listaExpresiones,ts,consola,exception): #VERFICAMOS CADA EXPRESION CON EL TIPO DE DATO DE CADA PARAMETRO argumentoscorrectos = True for expresion in listaExpresiones: expresuelta = Expresion.Resolver(expresion,ts,consola,exception) entornoFN = simboloFuncion.Entorno for simbolo in entornoFN.simbolos.values(): #simbolo = una variable if simbolo.categoria == TS.TIPO_DATO.PARAMETRO and simbolo.valor == None: correcto = verificarArgumento(expresuelta,simbolo.tipo) if correcto: simbolo.valor = expresuelta else: argumentoscorrectos = False break if not argumentoscorrectos: for simbolo in entornoFN.simbolos: if simbolo.categoria == TS.TIPO_DATO.PARAMETRO: simbolo.valor = None break return argumentoscorrectos
def getC3D(self, lista_optimizaciones_C3D): etiqueta = GeneradorTemporales.nuevo_temporal() listado = None for data in self.lista: id = Expresion.Resolver(data, None, None, None) if listado is None: listado = "'%s'" % id else: listado += ", '%s'" % id instruccion_quemada = 'CREATE TYPE %s AS ENUM (%s);' % (self.id, listado) c3d = ''' # ---------CREATE TYPE--------------- top_stack = top_stack + 1 %s = "%s" stack[top_stack] = %s ''' % (etiqueta, instruccion_quemada, etiqueta) return c3d
def ejecutar(deleteData, ts, consola, exceptions): #insert('test','tbventa',[1,4,'2020-10-12',450,'False','Venta de bomba de agua para toyota']) #insert('test','tbventa',[2,4,'2020-10-12',450,'False','Venta de bomba de agua para toyota']) if ts.validar_sim("usedatabase1234") == 1: # nombre de la bd bdactual = ts.buscar_sim("usedatabase1234") # se busca el simbolo y por lo tanto se pide el entorno de la bd BD = ts.buscar_sim(bdactual.valor) entornoBD = BD.Entorno print(deleteData.id, " -> nombre tabla") if entornoBD.validar_sim(deleteData.id) == 1: simbolo_tabla = entornoBD.buscar_sim(deleteData.id) if deleteData.where == None: truncate(BD.id, simbolo_tabla.id) else: datoiz = deleteData.where.iz datodr = deleteData.where.dr operador = deleteData.where.operador resultado = Expresion.Resolver(datodr, ts, consola, exceptions) #consola.append(f" El resultado es: {str(resultado)}") print("el nombre del campo es: ", datoiz.id) if simbolo_tabla.Entorno.validar_sim(datoiz.id) == 1: campos = simbolo_tabla.Entorno.simbolos i = 0 data = [] data.append(resultado) if delete(BD.id, simbolo_tabla.id, data) == 0: consola.append( f"Delete from {simbolo_tabla.id} exitosamente") else: consola.append( f"22005-error_in_assignment no existe la llave en tabla {simbolo_tabla.id}-{deleteData.fila}-{deleteData.columna}" ) exceptions.append( f"Error semantico-22005-error_in_assignment no existe la columna en tabla {simbolo_tabla.id}-{deleteData.fila}-{deleteData.columna}" ) else: consola.append( f"Error semantico-22005-error_in_assignment no existe la columna en tabla {simbolo_tabla.id}-{deleteData.fila}-{deleteData.columna}" ) exceptions.append( f"Error semantico-22005-error_in_assignment no existe la columna en tabla {simbolo_tabla.id}-{deleteData.fila}-{deleteData.columna}" ) print("ejecuntando un delete") else: consola.append( f"42P01 undefined_table, no existe la tabla {deleteData.id}" ) exceptions.append( f"Error semantico-42P01- 42P01 undefined_table, no existe la tabla {deleteData.id}-{deleteData.fila}-{deleteData.columna}" ) else: consola.append( "22005 error_in_assignment, No se ha seleccionado una BD\n") consola.append( f"Error semantico-22005-error_in_assignment No se ha seleccionado DB-{deleteData.fila}-{deleteData.columna}" ) exceptions.append( f"Error semantico-22005-error_in_assignment No se ha seleccionado DB-{deleteData.fila}-{deleteData.columna}" ) print("ejecuntando un delete")
def ResolverReturn(expr, ts, entornoFuncion, Consola, exception): if isinstance(expr, Expresion): exp1 = ResolverReturn(expr.iz, ts, entornoFuncion, Consola, exception) exp2 = ResolverReturn(expr.dr, ts, entornoFuncion, Consola, exception) if expr.operador == '=': return exp1 == exp2 elif expr.operador == '*': # id = expresion # id = (x < 9) if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 * exp2 return 'error' elif expr.operador == '/': if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 / exp2 return 'error' elif expr.operador == '+': if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 + exp2 return 'error' elif expr.operador == '-': if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 - exp2 return 'error' elif expr.operador == '^': if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 ** exp2 return 'error' elif expr.operador == '%': if (isinstance(exp1, float) and isinstance(exp2, float)) or ( isinstance(exp1, int) and isinstance(exp2, int)) or ( isinstance(exp1, float) and isinstance(exp2, int)) or ( isinstance(exp1, int) and isinstance(exp2, float)): return exp1 % exp2 return 'error' elif expr.operador == '==': # comparacion--------------------------------------- boole = exp1 == exp2 return boole elif expr.operador == '<>': boole = exp1 != exp2 return boole elif expr.operador == '>': boole = exp1 > exp2 return boole elif expr.operador == '<': boole = exp1 < exp2 return boole elif expr.operador == '!=': boole = exp1 != exp2 return boole elif expr.operador == '>=': boole = exp1 >= exp2 return boole elif expr.operador == '<=': boole = exp1 <= exp2 return boole elif isinstance(expr, Id): #VERIFICAMOS SI ES UNA VARIABLE DE LA FUNCION if ts.validar_sim(expr.id) == 1: simbolo = ts.buscar_sim(expr.id) return simbolo.valor else: if entornoFuncion.validar_sim(expr.id) == 1: simbolo = entornoFuncion.buscar_sim(expr.id) return simbolo.valor elif isinstance(expr, Primitivo): if expr.valor == 'TRUE': return True elif expr.valor == 'FALSE': return False else: return expr.valor elif isinstance(expr, Trigonometrica.Trigonometrica): return Trigonometrica.Trigonometrica.Resolver(expr, ts, Consola, exception) elif isinstance(expr, Math.Math_): # print("estoy llegango") return Math.Math_.Resolver(expr, ts, Consola, exception) elif isinstance(expr, Time): return Time.resolverTime(expr) elif isinstance(expr, Binario): return Binario.Resolver(expr, ts, Consola, exception) elif isinstance(expr, Unario): exp1 = Expresion.Resolver(expr.op, ts, Consola, exception) if expr.operador == '-': if isinstance(exp1, int) or isinstance(exp1, float): return exp1 * -1 elif expr.operador == '+': if isinstance(exp1, int) or isinstance(exp1, float): return exp1 elif expr.operador == '!': return not exp1
def comprobar_tipos(datainsertar, index, lista_valores, campo, lista_tabla, ts, Consola, exception, bd, tabla, globall): print("estoy aqui !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") todobien = False # print(lista_valores[index].valor) # print(date.fromisoformat(lista_valores[index].valor)) # print(isinstance(date.fromisoformat(lista_valores[index].valor),date)) # print('DATE' in str(lista_tabla.get(campo).tipo).upper()) datafinal = None if isinstance(lista_valores[index], Instruccion): datafinal = Expresion.Resolver(lista_valores[index], ts, Consola, exception) datainsertar.append(datafinal) else: datafinal = lista_valores[index].valor datainsertar.append(datafinal) print(datafinal) if isinstance(datafinal, int) and 'INTEGER' in str( lista_tabla.get(campo).tipo).upper(): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) elif isinstance(datafinal, float) and 'DOUBLE' in str( lista_tabla.get(campo).tipo).upper() or 'DECIMAL' in str( lista_tabla.get(campo).tipo).upper(): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) elif str(datafinal).upper() == 'TRUE' or str(datafinal).upper( ) == 'FALSE' and 'BOOLEAN' in str(lista_tabla.get(campo).tipo).upper(): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) elif isinstance(datafinal, str) and 'TEXT' in str( lista_tabla.get(campo).tipo).upper(): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) elif isinstance(str(datafinal), str) and 'VARCHAR' in str( lista_tabla.get(campo).tipo).upper() or 'CHARACTERVARYING' in str( lista_tabla.get(campo).tipo).upper() or 'CHARACTER' in str( lista_tabla.get(campo).tipo).upper() or 'CHAR' in str( lista_tabla.get(campo).tipo).upper(): todobien = True cantidad = str(lista_tabla.get(campo).tipo).split("-")[1] if len(str(datafinal)) <= int(cantidad): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, str(datafinal), lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) else: todobien = False elif isinstance(datafinal, float) and 'MONEY' in str( lista_tabla.get(campo).tipo).upper(): todobien = True todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) elif isinstance(datafinal, int) and 'MONEY' in str( lista_tabla.get(campo).tipo).upper(): todobien = True try: todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) except: todobien = False elif 'DATE' in str(lista_tabla.get(campo).tipo).upper(): try: #todobien= isinstance(date.fromisoformat(str(datafinal)), date) todobien = comprobarcheck( lista_tabla.get(campo).Entorno, 1, datafinal, lista_tabla.get(campo).id, ts, Consola, exception) todobien = comprobar_caracteristicas( lista_tabla.get(campo).valor, datafinal, Consola, exception, bd, tabla, index) except: print("error de tipo") todobien = False else: try: print( "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5" ) print(lista_tabla.get(campo).tipo) for data in globall.simbolos: print(":: ", data) if globall.validar_sim(str( lista_tabla.get(campo).tipo).lower()) == 1: print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4") for data in ts.simbolos: print(";;; ", data) simbolo_enumo = globall.buscar_sim( str(lista_tabla.get(campo).tipo).lower()) if datafinal in simbolo_enumo.valor: todobien = True Consola.append( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11" ) else: print("no encotrado") except: todobien = False return todobien
def ResolverExpresion(Expr, Consola, exception, DataSelect): if isinstance(Expr, Expresion): if str(Expr.operador).upper() == 'AND': print('and') exp1 = Where.ResolverExpresion(Expr.iz, Consola, exception, DataSelect) exp2 = Where.ResolverExpresion(Expr.dr, Consola, exception, DataSelect) cont = 0 filas = [] if isinstance(exp1, list) and isinstance(exp2, list): for fila in exp1: if fila in exp2: filas.append(fila) return filas elif str(Expr.operador).upper() == 'OR': print('or') exp1 = Where.ResolverExpresion(Expr.iz, Consola, exception, DataSelect) exp2 = Where.ResolverExpresion(Expr.dr, Consola, exception, DataSelect) cont = 0 filas = [] if isinstance(exp1, list) and isinstance(exp2, list): for fila in exp1: if not (fila in filas): filas.append(fila) for fila in exp2: if not (fila in filas): filas.append(fila) return filas else: val1 = Where.ResolverExpresion(Expr.iz, Consola, exception, DataSelect) val2 = Where.ResolverExpresion(Expr.dr, Consola, exception, DataSelect) filas = [] if isinstance(val1, list): contPos = -1 for valor in val1: if isinstance(valor, str): if str(valor).isnumeric() or str( valor).isdecimal(): valor = float(valor) prim = Primitivo(valor, Expr.fila, Expr.columna) if isinstance(val2, list): if isinstance(val2[contPos + 1], str): n = val2[contPos + 1] if str(n).isnumeric() or str(n).isdecimal(): n = float(n) else: n = val2[contPos + 1] prim2 = Primitivo(n, Expr.fila, Expr.columna) r = Expresion(prim, prim2, Expr.operador, Expr.fila, Expr.columna) b = Expresion.Resolver(r, Consola, exception, DataSelect) if isinstance(b, bool): if b: filas.append(contPos + 1) else: r = Expresion(prim, val2, Expr.operador, Expr.fila, Expr.columna) print(type(r).__name__) b = Expresion.Resolver(r, Consola, exception, DataSelect) if isinstance(b, bool): if b: filas.append(contPos + 1) contPos = contPos + 1 return filas elif isinstance(Expr, Primitivo): return Expr elif isinstance(Expr, Id): nombreCampo = Expr.id num = Where.ColumnasRepetidas(DataSelect, nombreCampo) if num == 1: # existe y no hay campos repetidos no hay ambigüedad datos = Where.ObtenerDatos(DataSelect, nombreCampo) print('datitos222') print(datos) return datos elif isinstance(Expr, IdId): print('id.id') nombreCampo = '' if isinstance(Expr.id1, Id): nombreCampo = Expr.id1.id if isinstance(Expr.id2, Id): nombreCampo = nombreCampo + '.' + Expr.id2.id num = Where.ColumnasRepetidas(DataSelect, nombreCampo) if num == 1: # existe y no hay campos repetidos no hay ambigüedad datos = Where.ObtenerDatos(DataSelect, nombreCampo) print('datitos222') print(datos) return datos elif isinstance(Expr, Math_.Math_): print(Expr.nombre) a = Math_.Math_.Resolver(Expr, None, Consola, exception) print(type(a).__name__) return Primitivo(a, Expr.fila, Expr.columna) elif isinstance(Expr, Trigonometrica.Trigonometrica): a = Trigonometrica.Trigonometrica.Resolver(Expr, None, Consola, exception) return Primitivo(a, Expr.fila, Expr.columna) elif isinstance(Expr, Time): return Time.resolverTime(Expr) elif isinstance(Expr, Where): a = Where.Resolver(Expr, None, Consola, exception, DataSelect) if isinstance(a[0], bool): return a[1] else: return []