コード例 #1
0
ファイル: Case.py プロジェクト: Sohanyuuu/tytus
    def traducir(self, tabla: Tabla, arbol: Arbol):
        super().traducir(tabla, arbol)
        retorno = Nodo3D()
        arbol.addc3d("# Inicia When")

        # Se traducen todas las funciones dentro del case
        for i in self.instrucciones:
            i.traducir(tabla, arbol)

        return
コード例 #2
0
ファイル: Elsif.py プロジェクト: sandymerida/tytus
    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
コード例 #3
0
ファイル: Logica.py プロジェクト: sandymerida/tytus
 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
コード例 #4
0
ファイル: Switch.py プロジェクト: sandymerida/tytus
    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)
コード例 #5
0
    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