Esempio n. 1
0
    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
        
Esempio n. 2
0
    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  
Esempio n. 3
0
    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