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() ThreeAddressCode().addCode(f"{temp} = '{self._tac}'") # LLAMANDO A FUNCION PARA ANALIZAR temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1
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, 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, 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 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 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, 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, 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): 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): 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): # 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 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): 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, 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, 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 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}()")
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 = 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): 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 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)
def process(self, instrucction): typeNew = Type(self._name.alias) for valor in self._values: typeNew._values.append(valor.alias) SymbolTable().add(typeNew._name, str(typeNew._values), 'TYPE', 'DB', None, '0', '0') print(typeNew) # 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): lbl_true = ThreeAddressCode().newLabel() lbl_false = ThreeAddressCode().newLabel() condition = None if type(self.condition) is not list: condition = self.condition.compile(environment) else: condition = self.condition[0].compile(environment) ThreeAddressCode().addCode(f"if({condition.value}): goto .{lbl_true}") ThreeAddressCode().addCode(f"goto .{lbl_false}") ThreeAddressCode().addCode( f"label .{lbl_true} # {condition.value} ---- True") for instr in self.instructions: instr.compile(environment) if self._else is not None: lbl_exit = ThreeAddressCode().newLabel() ThreeAddressCode().addCode(f"goto .{lbl_exit}") ThreeAddressCode().addCode( f"label .{lbl_false} # {condition.value} ---- False") if isinstance(self._else, If): self._else.compile(environment) else: for instr in self._else: instr.compile(environment) ThreeAddressCode().addCode( f"label .{lbl_exit} # {condition.value} ---- Salida") else: ThreeAddressCode().addCode( f"label .{lbl_false} # {condition.value} ---- False")
def hacerUnSoloCambio(func, entry_lower, temps_array, contador_funciones): newString = '' # viendo nada mas como queda armado if func in entry_lower: type_return = Procedures().getReturnType(func) # separando string split = entry_lower.split(func, 1) # recibiendo retorno de la funcion temp = temps_array[contador_funciones] newValue = temp # aumentando contador para obtener el temporal correspondiente contador_funciones += 1 temp_ant = '' for idx, val in enumerate(split): # Quitando parametros if idx > 0 and "(" in val and ")" in val: i = val.index("(") j = val.index(")") str1 = val[:i] str2 = val[j+1:] val = str1 + str2 if (idx < len(split) - 1): temp_ant = temp temp = ThreeAddressCode().newTemp() # newValue = temp # METIENDO COMILLAS if type_return == ColumnsTypes.TEXT or type_return == ColumnsTypes.VARCHAR: ThreeAddressCode().addCode( f"{temp} = \"{val}\" + \'\\\"\'") temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temp} = str({temp_ant}) + \'\\\"\'") else: ThreeAddressCode().addCode( f"{temp} = \"{val}\" + str({temp_ant})") newString += f"{val}" if len(split) > 1: print("val", val) contiene_reemplazo = True funciones = Procedures().getProceduresIDs() for func in funciones: if func in val: contiene_reemplazo = False break if contiene_reemplazo: temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = \"{val}\"") return hacerUnSoloCambio(func, val, temps_array, contador_funciones) return contador_funciones
def compile(self, environment): params = len(self.params) if self.isNew: self.environment = environment # TODO verificar if Procedures().saveProcedure(self.id, self, None, 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: self.setVariables(fun['variables'], environment)
def compile(self, environment: Ambito): var_search = environment.getVar(self.id) if isinstance(self.value, Select): val = self.value.compile(environment) ThreeAddressCode().addCode(f"Stack[{var_search.position}] = {val}") return else: val = self.value.compile(environment) if var_search == None: print("VARIABLE NO DECLARADA ") print(self.id) ErrorController().add(33, 'Execution', f"VARIABLE {id} NO DECLARADA", self.line, self.column) 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") ErrorController().add(33, 'Execution', f"VARIABLE {id} NO DECLARADA", self.line, self.column) return position = val.position temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = Stack[{position}]") ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {temporal}") else: if isinstance(val, str): ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {val}") else: ThreeAddressCode().addCode( f"Stack[{var_search.position}] = {val.value}")
def compile(self, instrucction): temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = '{self._tac};'")
def compile(self, expression): type_trigo = self.type_trigonometric temporal = ThreeAddressCode().newTemp() temp1 = self.expression1.compile(expression) temp2 = None if self.optional_expression2: temp2 = self.optional_expression2.compile(expression) if type_trigo.lower() == "acos": ThreeAddressCode().addCode(f"{temporal} = acos({temp1.value})") elif type_trigo.lower() == 'acosd': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = acos({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'asin': ThreeAddressCode().addCode(f"{temporal} = asin({temp1.value})") elif type_trigo.lower() == 'asind': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = asin({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'atan': ThreeAddressCode().addCode(f"{temporal} = atan({temp1.value})") elif type_trigo.lower() == 'atand': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = atan({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'atan2': ThreeAddressCode().addCode( f"{temporal} = atan2({temp1.value}, {temp2.value})") elif type_trigo.lower() == 'atan2d': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal1} = atan2({temp1.value}, {temp2.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'cos': ThreeAddressCode().addCode(f"{temporal} = cos({temp1.value})") elif type_trigo.lower() == 'cosd': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = cos({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'cot': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = 1 / {temporal1}") elif type_trigo.lower() == 'cotd': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})") temporal2 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal2} = 1 / {temporal1}") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal2})") elif type_trigo.lower() == 'sin': ThreeAddressCode().addCode(f"{temporal} = sin({temp1.value})") elif type_trigo.lower() == 'sind': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = sin({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'tan': ThreeAddressCode().addCode(f"{temporal} = tan({temp1.value})") elif type_trigo.lower() == 'tand': temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = tan({temp1.value})") ThreeAddressCode().addCode(f"{temporal} = degrees({temporal1})") elif type_trigo.lower() == 'cosh': ThreeAddressCode().addCode(f"{temporal} = cosh({temp1.value})") elif type_trigo.lower() == 'sinh': ThreeAddressCode().addCode(f"{temporal} = sinh({temp1.value})") elif type_trigo.lower() == 'tanh': ThreeAddressCode().addCode(f"{temporal} = tanh({temp1.value})") elif type_trigo.lower() == 'acosh': ThreeAddressCode().addCode(f"{temporal} = acosh({temp1.value})") elif type_trigo.lower() == 'asinh': ThreeAddressCode().addCode(f"{temporal} = asinh({temp1.value})") elif type_trigo.lower() == 'atanh': ThreeAddressCode().addCode(f"{temporal} = atanh({temp1.value})") return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column)
def compile(self, instrucction): temp = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp} = '{self._tac};'") SymbolTable().useDatabase = self._dbActual temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})")