def traducir(self, tabla: Tabla, arbol: Arbol): super().traducir(tabla, arbol) retorno = Nodo3D() arbol.addc3d("# Inicia Elsif") condicion = self.condicion.traducir(tabla, arbol) if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las funciones dentro del if for i in self.instrucciones: i.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) retorno.temporalAnterior = f"label .{etiquetaFin}" return retorno
def traducir(self, tabla, arbol): super().traducir(tabla, arbol) tablaLocal = Tabla(None) arbol.addc3d('\r@with_goto # Decorador necesario.') arbol.addc3d(f"\rdef {self.id}():") arbol.addc3d("global P") arbol.addc3d("global Pila") arbol.tamanio_actual = self.size arbol.etiqueta_fin = tablaLocal.getEtiqueta() if self.tipo.tipo != Tipo_Dato.VOID: variable = Simbolo("return", self.tipo, None, self.linea, self.columna) variable.rol = "Variable Local" variable.posicion = tablaLocal.stack variable.tamanio = 1 tabla.agregarSimbolo(variable) tablaLocal.stack += 1 for i in self.parametros: i.traducir(tablaLocal, arbol) tablaLocal.anterior = tabla for i in self.declaraciones: i.traducir(tablaLocal, arbol) for i in self.instrucciones: i.traducir(tablaLocal, arbol) # Se llena el reporte de la tabla de símbolo for i in tablaLocal.variables: i.ambito = self.id tabla.agregarReporteSimbolo(i) arbol.addComen("Etiqueta de salida función") arbol.addc3d(f"label .{arbol.etiqueta_fin}\n") arbol.tamanio_actual = None return
def traducir(self, tabla: Tabla, arbol: Arbol): super().traducir(tabla,arbol) retorno = Nodo3D() resultadoIzq = self.opIzq.traducir(tabla,arbol) if self.operador == 'AND': if isinstance(resultadoIzq, str): cadena = f"{resultadoIzq} AND " if isinstance(self.opDer, str): cadena += self.opDer + " " else: cadena += self.opDer.traducir(tabla,arbol) return cadena if resultadoIzq.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") resultadoDer = self.opDer.traducir(tabla,arbol) if resultadoDer.temporalAnterior == "0": # False and False etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = '' retorno.etiquetaFalse = f"{etiqueta1},{etiqueta2}" elif resultadoDer.temporalAnterior == "1": # False and True etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") arbol.addc3d(f"label .{etiqueta2}") retorno.etiquetaTrue = "" retorno.etiquetaFalse = f"{etiqueta1}" else: # False and Operación Relacional retorno.etiquetaTrue = resultadoDer.etiquetaTrue retorno.etiquetaFalse = f"{etiqueta1},{resultadoDer.etiquetaFalse}" return retorno elif resultadoIzq.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") arbol.addc3d(f"label .{etiqueta1}") resultadoDer = self.opDer.traducir(tabla,arbol) if resultadoDer.temporalAnterior == "0": # True and False etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = '' retorno.etiquetaFalse = f"{etiqueta2}" elif resultadoDer.temporalAnterior == "1": # True and True etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = f"{etiqueta2}" retorno.etiquetaFalse = "" else: # True and Operación Relacional retorno.etiquetaTrue = resultadoDer.etiquetaTrue retorno.etiquetaFalse = resultadoDer.etiquetaFalse return retorno retorno.imprimirEtiquetDestino(arbol, resultadoIzq.etiquetaTrue) resultadoDer = self.opDer.traducir(tabla, arbol) if resultadoDer.temporalAnterior == "0": # Operación Relacional and False etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") retorno.etiquetaTrue = '' retorno.etiquetaFalse = f"{resultadoIzq.etiquetaFalse},{etiqueta1}" return retorno elif resultadoDer.temporalAnterior == "1": # Operación Relacional and True etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") retorno.etiquetaTrue = f"{etiqueta1}" retorno.etiquetaFalse = f"{resultadoIzq.etiquetaFalse}" return retorno # Operación Relacional and Operación Relacional retorno.etiquetaTrue = resultadoDer.etiquetaTrue retorno.etiquetaFalse = f"{resultadoIzq.etiquetaFalse},{resultadoDer.etiquetaFalse}" return retorno elif self.operador == 'OR': if resultadoIzq.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") arbol.addc3d(f"label .{etiqueta1}") resultadoDer = self.opDer.traducir(tabla,arbol) if resultadoDer.temporalAnterior == "0": # False or False etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = "" retorno.etiquetaFalse = etiqueta2 elif resultadoDer.temporalAnterior == "1": # False or True etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = etiqueta2 retorno.etiquetaFalse = "" else: # False or Operación Relacional retorno.etiquetaTrue = resultadoDer.etiquetaTrue retorno.etiquetaFalse = resultadoDer.etiquetaFalse return retorno elif resultadoIzq.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") resultadoDer = self.opDer.traducir(tabla, arbol) if resultadoDer.temporalAnterior == "0": # True or False etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = etiqueta1 retorno.etiquetaFalse = etiqueta2 elif resultadoDer.temporalAnterior == "1": # True or True etiqueta2 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta2}") retorno.etiquetaTrue = f"{etiqueta1},{etiqueta2}" retorno.etiquetaFalse = "" else: # True or Operación Relacional retorno.etiquetaTrue = f"{etiqueta1},{resultadoDer.etiquetaTrue}" retorno.etiquetaFalse = resultadoDer.etiquetaFalse return retorno retorno.imprimirEtiquetDestino(arbol, resultadoIzq.etiquetaFalse) resultadoDer = self.opDer.traducir(tabla, arbol) if resultadoDer.temporalAnterior == "0": # Operación Relacional or False etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") retorno.etiquetaTrue = resultadoIzq.etiquetaTrue retorno.etiquetaFalse = etiqueta1 return retorno elif resultadoDer.temporalAnterior == "1": # Operación Relacional or True etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") retorno.etiquetaTrue = f"{resultadoIzq.etiquetaTrue},{etiqueta1}" retorno.etiquetaFalse = "" return retorno # Operación Relacional or Operación Relacional retorno.etiquetaTrue = f"{resultadoIzq.etiquetaTrue},{resultadoDer.etiquetaTrue}" retorno.etiquetaFalse = resultadoDer.etiquetaFalse return retorno elif self.operador == 'NOT': if resultadoIzq.temporalAnterior == "0": # False retorno.temporalAnterior = "1" elif resultadoIzq.temporalAnterior == "1": # True retorno.temporalAnterior = "0" else: # Operación Relacional retorno.etiquetaTrue = resultadoIzq.etiquetaFalse retorno.etiquetaFalse = resultadoIzq.etiquetaTrue return retorno
def traducir(self, tabla:Tabla, arbol:Arbol): super().traducir(tabla,arbol) arbol.addc3d("# Inicia Case") etiquetasSalida = [] for caso in self.lista_case: if len(caso.expresion2) == 1: relacional = Relacional(self.expresion1, caso.expresion2[0], "=", "", self.linea, self.columna) condicion = relacional.traducir(tabla, arbol) if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las funciones dentro del case caso.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) etiquetasSalida.append(f"label .{etiquetaFin}") else: for expre in caso.expresion2: relacional = Relacional(self.expresion1, expre, "=", "", self.linea, self.columna) condicion = relacional.traducir(tabla, arbol) if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las funciones dentro del case caso.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) etiquetasSalida.append(f"label .{etiquetaFin}") if len(self.instrucciones_else) != 0: # Se traducen todas las instrucciones dentro del else for i in self.instrucciones_else: i.traducir(tabla, arbol) # Se agregan las etiquetas de salida de los elsif for etiqueta in etiquetasSalida: arbol.addc3d(etiqueta)
def traducir(self, tabla: Tabla, arbol: Arbol): super().traducir(tabla, arbol) retorno = Nodo3D() arbol.addc3d("# Inicia If") condicion = self.condicion.traducir(tabla, arbol) # If if len(self.l_if) == 0 and len(self.instrucciones_else) == 0: if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las funciones dentro del if for i in self.instrucciones: i.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) arbol.addc3d(f"label .{etiquetaFin}") # If - Else elif len(self.l_if) == 0 and len(self.instrucciones_else) != 0: if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las instrucciones dentro del if for i in self.instrucciones: i.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) # Else # Se traducen todas las instrucciones dentro del else for i in self.instrucciones_else: i.traducir(tabla, arbol) arbol.addc3d(f"label .{etiquetaFin}") # If ... Elsif elif len(self.l_if) > 0 and len(self.instrucciones_else) == 0: if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las instrucciones dentro del if for i in self.instrucciones: i.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) # Elsif # Se traducen todas las instrucciones dentro del elsif etiquetasSalida = [] for elseif in self.l_if: resultado = elseif.traducir(tabla, arbol) etiquetasSalida.append(resultado.temporalAnterior) arbol.addc3d(f"label .{etiquetaFin}") # Se agregan las etiquetas de salida de los elsif for etiqueta in etiquetasSalida: arbol.addc3d(etiqueta) # If ... Elsif ... Else elif len(self.l_if) > 0 and len(self.instrucciones_else) > 0: if condicion.temporalAnterior == "0": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = "" condicion.etiquetaFalse = etiqueta1 elif condicion.temporalAnterior == "1": etiqueta1 = tabla.getEtiqueta() arbol.addc3d(f"goto .{etiqueta1}") condicion.etiquetaTrue = etiqueta1 condicion.etiquetaFalse = "" etiquetaFin = tabla.getEtiqueta() condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaTrue) # Se traducen todas las instrucciones dentro del if for i in self.instrucciones: i.traducir(tabla, arbol) arbol.addc3d(f"goto .{etiquetaFin}") condicion.imprimirEtiquetDestino(arbol, condicion.etiquetaFalse) # Elsif # Se traducen todas las instrucciones dentro del elsif etiquetasSalida = [] for elseif in self.l_if: resultado = elseif.traducir(tabla, arbol) etiquetasSalida.append(resultado.temporalAnterior) # Else # Se traducen todas las instrucciones dentro del else for i in self.instrucciones_else: i.traducir(tabla, arbol) arbol.addc3d(f"label .{etiquetaFin}") # Se agregan las etiquetas de salida de los elsif for etiqueta in etiquetasSalida: arbol.addc3d(etiqueta) return retorno