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") 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.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.addc3d(f"\n\treturn\n") return
def analizar(self, tabla, arbol): super().analizar(tabla,arbol) tablaLocal = Tabla(None) for i in self.parametros: i.analizar(tablaLocal, arbol) tablaLocal.anterior = tabla esFuncion = False if self.tipo.tipo != Tipo_Dato.VOID: esFuncion = True hayReturn = False for i in self.instrucciones: resultado = i.analizar(tablaLocal, arbol) if isinstance(i, Return): if isinstance(resultado, Excepcion): return resultado hayReturn = True if esFuncion and not hayReturn: error = Excepcion("42723", "Semantico", f"La función {self.id} requiere un valor de retorno", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error if not esFuncion and hayReturn: error = Excepcion("42723", "Semantico", f"El método {self.id} no requiere un valor de retorno", self.linea, self.columna) arbol.excepciones.append(error) arbol.consola.append(error.toString()) return error
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