def compile(self, environment): database_id = SymbolTable().useDatabase #ejecutando si hay llamada a alguna funcion temps_array = [] for value in self.arr_values: if isinstance(value, Funcion): temps_array.append(value.compile(environment)) new_val = putVarValues(self._tac, temps_array, environment) temp = '' if new_val == self._tac: #Es un temporal --- quitar comillas temp = ThreeAddressCode().newTemp() if database_id is not None: ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {new_val}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{new_val}\"") else: temp = new_val #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1
def compile(self, environment): value1 = self.value1.compile(environment) value2 = self.value2.compile(environment) if isinstance(value1, PrimitiveData): if value1.data_type == DATA_TYPE.STRING: value1.value = f"\'{value1.value}\'" if isinstance(value1, PrimitiveData): if value2.data_type == DATA_TYPE.STRING: value2.value = f"\'{value2.value}\'" try: temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = {value1.value} {getOperador(self.operator)} {value2.value}" ) return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column) except TypeError: desc = "Error de tipo" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR, Relop, no acepta ids" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, enviroment): temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = '{self._tac}'") #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1
def compile(self, environment: Ambito): var_search = environment.getVar(self.id) val = self.value.compile(environment) if var_search == None: print("VARIABLE NO DECLARADA " + self.id) return if isinstance(self.value, ObjectReference): #Buscar variable val = self.value.compile(environment) if isinstance(val, PrimitiveData): ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {val.alias}") return val = environment.getVar(val) if val is None: print("VARIABLE NO DECLARADA") return position = val.position temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]") ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {temporal}") else: ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {val.value}")
def compile(self, expression): expression1 = self.value.compile(expression) type_unary_or_other = self.sign temporal = ThreeAddressCode().newTemp() try: if expression1.data_type != DATA_TYPE.NUMBER: print('error') return dataTemp = f"{temporal} = 0" if type_unary_or_other == SymbolsUnaryOrOthers.UMINUS or type_unary_or_other == SymbolsUnaryOrOthers.BITWISE_NOT: dataTemp = f"{temporal} = -{expression1.value}" elif type_unary_or_other == SymbolsUnaryOrOthers.UPLUS: dataTemp = f"{temporal} = {expression1.value}" elif type_unary_or_other == SymbolsUnaryOrOthers.SQUARE_ROOT: dataTemp = f"{temporal} = sqrt({expression1.value}) # |/" elif type_unary_or_other == SymbolsUnaryOrOthers.CUBE_ROOT: temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = 1 / 3") dataTemp = f"{temporal} = {expression1.value} ** {temporal1} # ||/" ThreeAddressCode().addCode(dataTemp) return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column) except: desc = "FATAL ERROR --- UnaryOrSquareExpressions" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, environment): try: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" cambio = False if val[0] == 't': sub = val[1:] if sub.isnumeric(): # ES UN TEMPORAL dataTemp = f"{temp} = {val}" cambio = True if cambio is False: dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = sha256({temp}.encode()).hexdigest()") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, instrucction): temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = '{self._tac}'") #LLAMANDO A FUNCION PARA ANALIZAR temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1
def setVariables(self, var_array, environment): if self.isCall: value = 0 for index, var in enumerate(var_array): value = self.params[index].compile(environment) if isinstance(value, PrimitiveData): if value.data_type == DATA_TYPE.STRING: if value.value[0] == "'" or value.value[0] == "\"": value.value = f"\"{value.value}\"" else: value.value = f"\"\'{value.value}\'\"" ThreeAddressCode().addCode( f"Stack[{var.position}] = {value.value}") temp = ThreeAddressCode().newTemp() #Llamando a la funcion ThreeAddressCode().addCode(f"{self.id}()") #Obteniendo el valor de retorno de la funcion ThreeAddressCode().addCode("#Obteniendo valor de retorno--------") ThreeAddressCode().addCode(f"{temp} = Stack[P]") return temp return None
def generar_tac(self): global report_error global report_ast DataWindow().clearConsole() SymbolTable().destroy() ThreeAddressCode().destroy() texto = self.entrada.get('1.0', END) result = parse(texto) print(result) # Imprime el AST report_error = ReportError() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: ambito = Ambito(None) for inst in result: inst.compile(ambito) DataWindow().consoleText(ThreeAddressCode().getCode()) ThreeAddressCode().writeFile() result2 = parse2(texto) #AST GRAFICO report_ast = result2
def compile(self, instrucction): temp = ThreeAddressCode().newTemp() database_id = SymbolTable().useDatabase if database_id is not None: ThreeAddressCode().addCode( f"{temp} = \"USE {database_id}; {self._tac}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"")
def compile(self, environment): val = self.value.compile(environment) pos = ThreeAddressCode().stackCounter environment.addVar(self.id, self.data_type, val.value, pos, self.line, self.column) temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = {val.value}") ThreeAddressCode().addStack(temp) # ThreeAddressCode().addCode(f"print(Stack)") print("ANDO POR AQUI")
def compile(self, environment): value1 = self.value1.compile(environment) value2 = self.value2.compile(environment) operator = self.operator temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = {value1.value} {operator} {value2.value}") return PrimitiveData(DATA_TYPE.BOOLEANO, temporal, self.line, self.column)
def compile(self, environment): newAmbito = Ambito(environment) pos = 0 for var in self.params: pos = ThreeAddressCode().stackCounter newAmbito.addVar(var.id, var.data_type, None, pos, var.line, var.column) lbl_exit = ThreeAddressCode().newLabel() self.body.compile(newAmbito) ThreeAddressCode().addCode(f"label .{lbl_exit}") #Agregando etiqueta ThreeAddressCode().addCode(f"print(\"GraciasDios, SALI\")")
def compile(self, environment): #CREANDO C3D temp = ThreeAddressCode().newTemp() database_id = SymbolTable().useDatabase if database_id is not None: ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {self._tac}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"") #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
def compile(self, environment): if self.val_return is not None: value = self.val_return.compile(environment) pos = ThreeAddressCode().stackCounter #Metiendo el valor a retornar al Stack ThreeAddressCode().addStack(value.value) ThreeAddressCode().addCode(f"P = {pos}") #Poniendo salto incondicional lbl_return = environment.getReturn() ThreeAddressCode().addCode(f"goto .{lbl_return}")
def compile(self, environment): try: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = {temp}.strip()") return temporal except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, environment): try: i = self.down.compile(environment).value j = self.up.compile(environment).value temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" cambio = False if val[0] == 't': sub = val[1:] if sub.isnumeric(): # ES UN TEMPORAL dataTemp = f"{temp} = {val}" cambio = True if cambio is False: dataTemp = f"{temp} = '{val}'" tempi = ThreeAddressCode().newTemp() tempj = ThreeAddressCode().newTemp() dataTempi = f"{tempi} = {i}" dataTempj = f"{tempj} = {j}" ThreeAddressCode().addCode(dataTemp) ThreeAddressCode().addCode(dataTempi) ThreeAddressCode().addCode(dataTempj) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = {temp}[{tempi}:{tempj}]") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, enviroment): temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = '{self._tac}'") #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1 try: pass except: desc = f": Name of Index not Exists" ErrorController().add(4, 'Execution', desc, self.line, self.column) #manejar linea y columna
def compile(self, environment): try: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = len({temp})") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def print(self, environment): if ThreeAddressCode().searchFunction(self.id): return None ThreeAddressCode().newFunction(self.id) newAmbito = Ambito(environment) pos = 0 var_array = [] for var in self.params: pos = ThreeAddressCode().stackCounter var_array.append(newAmbito.addVar(var.id, var.data_type, None, pos, var.line, var.column)) ThreeAddressCode().incStackCounter() pos = ThreeAddressCode().stackCounter #Generando etiqueta de salida para la funcion lbl_exit = ThreeAddressCode().newLabel() newAmbito.lbl_return = lbl_exit #Agregando cuerpo de la funcion self.body.compile(newAmbito) # Agregando etiqueta de salida ThreeAddressCode().addCode(f"label .{lbl_exit}") # Imprime primera variable declarada, NO parametro # ThreeAddressCode().addCode(f"print(Stack[{pos}])") ThreeAddressCode().createFunction(self.id, self.params, var_array) return var_array
def compile(self, environment): name_column = self.name_column.compile(environment) name_column = name_column.value value1 = self.value1.compile(environment).value value2 = self.value2.compile(environment).value data = "" try: temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = {str(value1)} <= {name_column}") temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal1} = {name_column} <= {str(value2)}") temporal2 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal2} = {temporal} and {temporal1}") if self.opt_not: temporal3 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal3} = ~({temporal2})") return PrimitiveData(DATA_TYPE.STRING, temporal3, 0, 0) return PrimitiveData(DATA_TYPE.STRING, temporal2, 0, 0) except: desc = "FATAL ERROR, murio en Between, F" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, environment): val = self.reference_column.compile(environment) if isinstance(val, PrimitiveData): return val val = environment.getVar(val) if val is None: print("VARIABLE NO DECLARADA") return None position = val.position temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]") return PrimitiveData(None, temporal, 0, 0)
def setVariables(self, var_array, environment): if self.isCall: value = 0 for index, var in enumerate(var_array): value = self.params[index].compile(environment) if isinstance(value, PrimitiveData): if value.data_type == DATA_TYPE.STRING: value.value = f"\'{value.value}\'" ThreeAddressCode().addCode(f"Stack[{var.position}] = {value.value}") #Llamando a la funcion ThreeAddressCode().addCode(f"{self.id}()") #Una procedimiento almacenado NO devuelve nada
def setVariables(self, var_array, environment): if self.isCall: value = 0 print(type(self.params[0])) for index, var in enumerate(var_array): value = self.params[index].compile(environment) if isinstance(value, PrimitiveData): if value.data_type == DATA_TYPE.STRING: value.value = f"\'{value.value}\'" ThreeAddressCode().addCode( f"Stack[{var.position}] = {value.value}") temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode("#Retornando valor --------") ThreeAddressCode().addCode(f"{temp} = Stack[P]")
def ejecutar_sql(self): global report_error global report_ast DataWindow().clearConsole() SymbolTable().destroy() ThreeAddressCode().destroy() texto = self.entrada.get('1.0', END) result = parse(texto) # jsonStr = json.dumps(result, default=lambda o: o.__dict__) #Convierte el AST a formato JSON para poder saber como se esta formando # print(result) # Imprime el AST report_error = ReportError() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: result2 = parse2(texto) report_ast = result2 # ---------- TEST --------- for inst in result: # esto es por los select anidados (subquerys), no encontre otra menera # de retornar la tabla dibujada, lo hacia en mi clase # pero si lo dejaba ahi me tronaban las subquery, # prueben que no les de problema if isinstance(inst, Select): result = inst.process(0) if isinstance(result, DataFrame): DataWindow().consoleText(format_df(result)) elif isinstance(result, list): DataWindow().consoleText(format_table_list(result)) else: inst.process(0)
def compile(self, environment): val = self.reference_column.compile(environment) if isinstance(val, PrimitiveData): return val temp_val = val val = environment.getVar(val) if val is None: ErrorController().add(33, 'Execution', f"VARIABLE {temp_val} NO DECLARADA", 0, 0) return None position = val.position temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]") return PrimitiveData(None, temporal, 0, 0)
def compile(self, environment): val = None if self.value is not None: val = self.value.compile(environment) if isinstance(val, PrimitiveData): if val.data_type == DATA_TYPE.STRING: val.value = f"'{val.value}'" pos = ThreeAddressCode().stackCounter if val is not None: environment.addVar(self.id, self.data_type, val.value, pos, self.line, self.column) temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = {val.value}") ThreeAddressCode().addStack(temp) else: environment.addVar(self.id, self.data_type, None, pos, self.line, self.column)
def compile(self, environment): params = len(self.params) if self.isNew: self.environment = environment # TODO verificar if Procedures().saveProcedure(self.id, self, self.line, self.column): var_array = self.print(environment) self.setVariables(var_array, environment) else: var_array = Procedures().getProcedure(self.id, params, self.line, self.column) if var_array: self.setVariables(var_array, environment) fun = ThreeAddressCode().searchFunction(self.id) if fun: if len(self.params) > 0: self.setVariables(fun['variables'], environment) #temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{self.id}()")
def cambiarVariable(func, entry_lower, diccionario: dict): newString = '' #viendo nada mas como queda armado if func in entry_lower: #separando string split = entry_lower.split(func, 1) temp = None try: temp = diccionario[func] newValue = temp except: return temp_ant = '' for idx, val in enumerate(split): #Quitando parametros if (idx < len(split) - 1): temp_ant = temp temp = ThreeAddressCode().newTemp() keys = diccionario.keys() split2 = [] for key in keys: if key in val: split2 = val.split(key) val = split2[(len(split2) - 1)] # newValue = temp #METIENDO COMILLAS ThreeAddressCode().addCode( f"{temp} = \"{val}\" + str({temp_ant})") newString += f"{val}" if len(split) > 1: print("val", val) contiene_reemplazo = True funciones = diccionario.keys() for func3 in funciones: if func3 in val: contiene_reemplazo = False break if contiene_reemplazo: temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = \"{val}\"") return cambiarVariable(func, val, diccionario) return
def compile(self, environment): value1 = self.value1.compile(environment) value2 = self.value2.compile(environment) try: temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = {value1.value} {getOperador(self.operador)} {value2.value}" ) return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column) except TypeError: desc = "Error de tipo" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR, ArithmeticBinaryOperation, no acepta ids" ErrorController().add(34, 'Execution', desc, self.line, self.column)