def ObtenerCadenaEntradaWhere(expr,lista_funcionesProcedimientos): if isinstance(expr,Expresion): exp1 = Expresion.ObtenerCadenaEntradaWhere(expr.iz,lista_funcionesProcedimientos) exp2 = Expresion.ObtenerCadenaEntradaWhere(expr.dr,lista_funcionesProcedimientos) expresion = exp1 + " " + str(expr.operador) + " " + exp2 print('expre2'+str(exp2)) return expresion elif isinstance(expr,Id): expresion = expr.id if lista_funcionesProcedimientos == None: return str(expresion) else: for func in lista_funcionesProcedimientos: for param in func.parametros: if isinstance(param,Parametro): if param.id == expresion: return ' {'+str(expresion)+'} ' return str(expresion) elif isinstance(expr, Primitivo): expresion = Primitivo.ObtenerCadenaEntrada(expr) return str(expresion) elif isinstance(expr, Trigonometrica.Trigonometrica): expresion = Trigonometrica.Trigonometrica.obtenerCadenaEntrada(expr,False) return str(expresion) elif isinstance(expr, Math.Math_): expresion = Math.Math_.obtenerCadenaEntrada(expr,False) return str(expresion) elif isinstance(expr,Time): return Time.ObtenerCadenaEntrada(expr) elif isinstance(expr,Binario): return str(Binario.ObtenerCadenaEntrada(expr,False)) elif isinstance(expr, Unario): exp1 = Expresion.ObtenerCadenaEntradaWhere(expr.op,lista_funcionesProcedimientos) return str(expr.operador)+exp1 elif isinstance(expr, Llamada): llamada = Llamada.obtenerCadena(expr,False) return llamada elif isinstance(expr, IdId): idid= IdId.ObtenerCadenaEntrada(expr) return str(idid) elif isinstance(expr,Where.Where): wherwcad= Where.Where.ObtenerCadenaEntrada(expr, lista_funcionesProcedimientos) print('CADENA WHERE'+wherwcad) return str(wherwcad)
def ObtenerCadenaEntrada(expr, condicion): if isinstance(expr, Expresion): exp1 = Expresion.ObtenerCadenaEntrada(expr.iz, condicion) exp2 = Expresion.ObtenerCadenaEntrada(expr.dr, condicion) if condicion: expresion = '(' + exp1 + " " + str( expr.operador) + " " + exp2 + ') ' else: expresion = exp1 + " " + str(expr.operador) + " " + exp2 return expresion elif isinstance(expr, Id): expresion = expr.id return str(expresion) elif isinstance(expr, Primitivo): expresion = Primitivo.ObtenerCadenaEntrada(expr) return str(expresion) elif isinstance(expr, Trigonometrica.Trigonometrica): expresion = Trigonometrica.Trigonometrica.obtenerCadenaEntrada( expr, condicion) return str(expresion) elif isinstance(expr, Math.Math_): expresion = Math.Math_.obtenerCadenaEntrada(expr, condicion) return str(expresion) elif isinstance(expr, Time): return Time.ObtenerCadenaEntrada(expr) elif isinstance(expr, Binario): return str(Binario.ObtenerCadenaEntrada(expr, condicion)) elif isinstance(expr, Unario): exp1 = Expresion.ObtenerCadenaEntrada(expr.op, condicion) return str(expr.operador) + exp1 elif isinstance(expr, Llamada): llamada = Llamada.obtenerCadena(expr, condicion) return llamada elif isinstance(expr, IdId): idid = IdId.ObtenerCadenaEntrada(expr) return str(idid) elif isinstance(expr, Where.Where): wherwcad = Where.Where.ObtenerCadenaEntrada(expr) return str(wherwcad)
def Resolver(expr, ts, Consola, exception): if isinstance(expr, Expresion): exp1 = Expresion.Resolver(expr.iz, ts, Consola, exception) exp2 = Expresion.Resolver(expr.dr, ts, 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): if ts.validar_sim(expr.id) == 1: return expr.id else: return 'holamundo' elif isinstance(expr, Primitivo): 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 traducir(expre, ts, consola, exception, tv, regla, antes, optimizado, ID): #consola.append('\ten expresion\n') if isinstance(expre, Primitivo): if expre.cadena: #devolver cadenas con comillas return '\'' + str(expre.valor) + '\'' elif str(expre.valor) == 'FALSE': return 'False' elif str(expre.valor) == 'TRUE': return 'True' else: return str(expre.valor) elif isinstance(expre, Id): return str(expre.id) #por el momento elif isinstance(expre, Expresion): expre1 = Expresion.traducir(expre.iz, ts, consola, exception, tv, regla, antes, optimizado, ID) expre2 = Expresion.traducir(expre.dr, ts, consola, exception, tv, regla, antes, optimizado, ID) #pruebas de optimizacion bandera = True if expre.operador == '/': #regla 18 x = 0 / y -> x = 0 if expre1 == '0': bandera = False temp = tv.Temp() consola.append(f'\t{temp} = 0\n') regla.append('18') antes.append(f'{temp} = 0 / {expre2}') optimizado.append(f'{temp} = 0') return temp elif expre2 == '0': return 0 elif expre2 == '1': #var = v / 1 if ID != None and ID != 'IF': #asignacion o declaracion if ID == expre1: #regla 11 x = x / 1 regla.append('11') antes.append(f'{ID} = {expre1} / 1') optimizado.append('#Se elimina la instruccion') else: #regla 15 x = y / 1 -> x = y regla.append('15') antes.append(f'{ID} = {expre1} / 1') optimizado.append(f'{ID} = {expre1}') #### temp = tv.Temp() consola.append(f'\t{temp} = {expre1}\n') return temp elif expre.operador == '*': #regla 17 x = y * 0 -> x = 0 if expre1 == '0' or expre2 == '0': bandera = False temp = tv.Temp() consola.append(f'\t{temp} = 0\n') regla.append('17') antes.append(f'{temp} = {expre1} * {expre2}') optimizado.append(f'{temp} = 0') return temp #regla 16 x = y * 2 -> x = y + y elif expre1 == '2': bandera = False temp = tv.Temp() consola.append(f'\t{temp} = {expre2} + {expre2}\n') regla.append('16') antes.append(f'{temp} = {expre1} * {expre2}') optimizado.append(f'{temp} = {expre2} + {expre2}') return temp elif expre2 == '2': bandera = False temp = tv.Temp() consola.append(f'\t{temp} = {expre1} + {expre1}\n') regla.append('16') antes.append(f'{temp} = {expre1} * {expre2}') optimizado.append(f'{temp} = {expre1} + {expre1}') return temp elif expre2 == '1': #var = v * 1 if ID != None and ID != 'IF': #es de asignacion o declaracion if ID == expre1: #regla 10 x = x * 1 -> se elimina regla.append('10') antes.append(f'{ID} = {expre1} * 1') optimizado.append('#Se elimina la instruccion') else: #regla 14 x = y * 1 -> x = y regla.append('14') antes.append(f'{ID} = {expre1} * 1') optimizado.append(f'{ID} = {expre1}') temp = tv.Temp() consola.append(f'\t{temp} = {expre1}\n') return temp elif expre1 == '1': #var = 1 * v if ID != None and ID != 'IF': #asignacion o declaracion if ID == expre2: #regla 10 x = 1 * x -> se elimina regla.append('10') antes.append(f'{ID} = 1 * {expre2}') optimizado.append('#Se elimina la instruccion') else: #regla 14 x = 1 * y -> x = y regla.append('14') antes.append(f'{ID} = 1 * {expre2}') optimizado.append(f'{ID} = {expre2}') temp = tv.Temp() consola.append(f'\t{temp} = {expre2}\n') return temp elif expre.operador == '+': #var = v + 0 if expre2 == '0': if ID != None and ID != 'IF': #es de asignacion o declaracion if ID == expre1: #regla 8 x = x + 0 -> se elimina regla.append('8') antes.append(f'{ID} = {expre1} + 0') optimizado.append('#Se elimina la instruccion') else: #regla 12 x = y + 0 -> x = y regla.append('12') antes.append(f'{ID} = {expre1} + 0') optimizado.append(f'{ID} = {expre1}') temp = tv.Temp() consola.append(f'\t{temp} = {expre1}\n') return temp #var = 0 + v elif expre1 == '0': if ID != None and ID != 'IF': #es de asignacion o declaracion if ID == expre2: #regla 8 x = 0 + x -> se elimina regla.append('8') antes.append(f'{ID} = 0 + {expre2}') optimizado.append('#Se elimina la instruccion') else: #regla 12 x = 0 + y -> x = y regla.append('12') antes.append(f'{ID} = 0 + {expre2}') optimizado.append(f'{ID} = {expre2}') temp = tv.Temp() consola.append(f'\t{temp} = {expre2}\n') return temp elif expre.operador == '-': #var = v + 0 if expre2 == '0': if ID != None and ID != 'IF': #es de asignacion o declaracion if ID == expre1: #regla 9 x = x - 0 -> se elimina regla.append('9') antes.append(f'{expre1} = {expre1} - 0') optimizado.append('#Se elimina la instruccion') else: #regla 13 x = y - 0 -> x = y regla.append('13') antes.append(f'{ID} = {expre1} - 0') optimizado.append(f'{ID} = {expre1}') temp = tv.Temp() consola.append(f'\t{temp} = {expre1}\n') return temp #booleanos elif expre.operador == '<' or expre.operador == '<=' or expre.operador == '>' or expre.operador == '>=' or expre.operador == '==' or expre.operador == '!=': if ID == 'IF': if Expresion.esNumero(expre1) and Expresion.esNumero( expre2): print('REGLA 4 o 5') verdadero = False if expre.operador == '<': verdadero = expre1 < expre2 elif expre.operador == '<=': verdadero = expre1 <= expre2 elif expre.operador == '>': verdadero = expre1 > expre2 elif expre.operador == '>=': verdadero = expre1 >= expre2 elif expre.operador == '==': verdadero = expre1 == expre2 elif expre.operador == '!=': verdadero = expre1 != expre2 if verdadero: #regla 4 print('regla 4') prim = tv.SiguienteEt() v1 = prim[1:] v1 = int(v1) regla.append('4') antes.append( f'if {tv.SiguienteTemp()}:<br>   goto .{prim}<br>else:<br>   goto .L{v1 + 1}' ) optimizado.append(f'goto .{prim}') else: #regla 5 print('regla 5') prim = tv.SiguienteEt() v1 = prim[1:] v1 = int(v1) regla.append('5') antes.append( f'if {tv.SiguienteTemp()}:<br>   goto .{prim}<br>else:<br>   goto .L{v1 + 1}' ) optimizado.append(f'goto .L{v1 + 1}') else: print('No SON NUMEROS') if bandera: temp = tv.Temp() consola.append( f'\t{temp} = {expre1} {expre.operador} {expre2}\n') return temp elif isinstance(expre, Unario): expre1 = Expresion.traducir(expre.op, ts, consola, exception, tv, regla, antes, optimizado, ID) temp = tv.Temp() operador = expre.operador if expre.operador == '!': operador = 'not' consola.append(f'\t{temp} = {operador}{expre1}\n') return temp elif isinstance(expre, Math.Math_): return Math.Math_.traducir(expre, ts, consola, exception, tv, regla, antes, optimizado, ID) elif isinstance(expre, Binario): return Binario.traducir(expre, ts, consola, exception, tv, regla, antes, optimizado, ID) elif isinstance(expre, Trigonometrica.Trigonometrica): return Trigonometrica.Trigonometrica.traducir( expre, ts, consola, exception, tv, regla, antes, optimizado, ID) elif isinstance(expre, Select.Select): val = '' if (expre.caso == 1): a = Time.resolverTime(expre.time) val = str(a) print('caso<3---') print(str(expre.caso)) return a elif (expre.caso == 3): variable = SelectInst.Select_inst() trash = [] a = SelectInst.Select_inst.ejecutar(variable, expre, ts, trash, exception) print( "-------------------------------------------------------") print("\n") print("valor", a) print( "----------------------------------------------------------" ) for val in a: print('valor' + str(val[0])) return str(val[0]) elif (expre.caso == 4): a = Selectp3.Selectp3.ejecutar(expre, ts, consola, exception, False) print(a) for val in a[1]: print('valor' + str(val)) return str(val) elif (expre.caso == 5): a = Selectp4.Selectp4.ejecutar(expre, ts, consola, exception, False) print('ACAAAAAAA') for val in a[1]: print('valor' + str(val[0])) return str(val[0]) elif isinstance(expre, Time): print('traduciendo time') return Time.traducir(expre, ts, consola, exception, tv)
def ejecutar(Select, ts, Consola, exceptions, Mostrar): #type(self).__name__ print('what -- ' + type(Select.columnas).__name__) x = PrettyTable() rowpp = [] en = [] aux = 0 print(Select.columnas) for columna in Select.columnas: i = 0 if isinstance(columna, Select.__class__): Consola.append('what -- ' + type(columna).__name__ + '\n') elif isinstance(columna, Time): en.append('time') time = Time.resolverTime(columna) rowpp.append(time) #Consola.append('what -- ' + time + '\n') elif isinstance(columna, IdId): # no porque no tiene from Consola.append('what -- ' + type(columna).__name__ + '\n') exceptions.append( 'Error semantico - 42P01 - falta una entrada para la tabla en la cláusula FROM, error en ' + ' - ' + str(Select.fila) + ' - ' + str(Select.columna) + '') elif isinstance(columna, Id): # no porque no tiene from Consola.append('what -- ' + type(columna).__name__ + '\n') exceptions.append( 'Error semantico - 42703 - no existe la columna, error en ' + ' - ' + str(Select.fila) + ' - ' + str(Select.columna) + '') ''' elif isinstance(columna,Llamada): #rowpp.append(Llamada.obtenerCadena(columna,1) Llamada.obtenerCadena(columna)''' elif isinstance(columna, IdAsId): # no porque no tiene from if (isinstance(columna.id2, Primitivo)): en.append(columna.id2.valor) else: en.append(columna.id2.id) val = IdAsId.Resolver(columna, Consola) rowpp.append(str(val)) #Consola.append('what -- ' + str(val)+ '\n') elif isinstance(columna, Math_): #hay que resolver en.append(str(columna.nombre + str(aux))) val = Math_.Resolver(columna, Consola, Consola, exceptions) rowpp.append(str(val)) aux = aux + 1 #Consola.append('what -- ' + type(columna).__name__ + '\n') elif isinstance(columna, Trigonometrica): #hay que resolver en.append(str(columna.trig + str(aux))) REST = Trigonometrica.Resolver(columna, ts, Consola, exceptions) rowpp.append(str(REST)) aux = aux + 1 #Consola.append('what -- ' + str(REST) + '\n') elif isinstance(columna, Expresion.Expresion): #hay que resolver en.append(str("col" + str(aux))) REST = Expresion.Expresion.Resolver(columna, ts, Consola, exceptions) rowpp.append(str(REST)) aux = aux + 1 #Consola.append('what -- ' + str(REST) + '\n') elif isinstance(columna, Binario): #hay que resolver en.append(str("col" + str(aux))) REST = Binario.Resolver(columna, ts, Consola, exceptions) rowpp.append(str(REST)) aux = aux + 1 #Consola.append('what -- ' + str(REST) + '\n') elif isinstance(columna, Primitivo): print("aqui") print(columna) print(columna.valor) en.append(str("col" + str(aux))) #REST=Binario.Resolver(columna,ts,Consola,exceptions) rowpp.append(str(columna.valor)) aux = aux + 1 #en.append(columna.valor) i = i + 1 x.add_row(rowpp) x.field_names = en if Mostrar: Consola.append(x.get_string() + '\n') return [en, rowpp]