예제 #1
0
    def obtenerValorNumerico(self, cadena):
        decimal = False
        retorno = ""
        for caracter in cadena:
            if (caracter.isdigit()):
                retorno += caracter
            elif (caracter == "." and retorno != ""):
                if not decimal:
                    decimal = True
                    retorno += caracter
                else:
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, No es posible convertir la cadena ("
                        + cadena + ") a un número", self.linea, self.columna)
                    ReporteErrores.func(error)
                    break
            else:
                error = Error(
                    "SEMANTICO",
                    "Error semantico, No es posible convertir la cadena (" +
                    cadena + ") a un número", self.linea, self.columna)
                ReporteErrores.func(error)
                break

        if (retorno == ""): return 0
        if retorno.endswith("."): return int(retorno[0:len(retorno) - 1])
        if decimal: return float(retorno)

        return int(retorno)
예제 #2
0
파일: Imprimir.py 프로젝트: harias25/MinorC
    def traducir(self,ent,arbol,ventana):
        valorfinal = "print(\""
        cadena = self.cad.traducir(ent,arbol,ventana)
        if(cadena == None): return None
        
        if(self.expresiones==None):
            if(cadena.tipo == Tipo.CHAR):
                valorfinal = "print("+cadena.temporal.utilizar()+");"
            else:
                valorfinal += cadena.temporal.utilizar()+"\");"      
        else:
            cadena = cadena.temporal.utilizar()
            cadena = cadena[1:-1]
            for expresion in self.expresiones:
                exp_3D = expresion.traducir(ent,arbol,ventana)
                if(exp_3D == None): return None
                
                if(expresion.tipo == Op.PRIMITIVO):
                    if(exp_3D.codigo3D != ""):  ventana.editor.append("\n"+exp_3D.codigo3D) 
                    pos = cadena.index("%")
                    if(pos==-1):
                        error = Error("SEMANTICO","Error semantico, La expresión es incorrecta para imprimir.",self.linea,self.columna)
                        ReporteErrores.func(error)
                        return None
                
                    llave = cadena[pos:pos+2]
                    cadena = self.concatenar(cadena,llave,exp_3D.temporal.utilizar())
                    if(cadena == None): return None 
                
                else:
                    #if(exp_3D.codigo3D != ""):  ventana.editor.append("\n"+exp_3D.codigo3D) 
                    
                    pos = cadena.index("%")
                    if(pos==-1):
                        error = Error("SEMANTICO","Error semantico, La expresión es incorrecta para imprimir.",self.linea,self.columna)
                        ReporteErrores.func(error)
                        return None

                    temporal =  exp_3D.temporal.utilizar()
                    if ' ' in temporal:
                        temp2 = Temp.nuevoTemporal(1)
                        ventana.editor.append("\n"+temp2.utilizar()+" = "+temporal+";") 
                        temporal = temp2.utilizar()

                    ventana.editor.append("\n"+"print(\""+cadena[0:pos]+"\");") 
                    if(exp_3D.codigo3D != ""):  ventana.editor.append("\n"+exp_3D.codigo3D) 
                    
                    ventana.editor.append("\n"+"print("+temporal+");") 
                    cadena = cadena[pos+2:]

            valorfinal += cadena+"\");"

        ventana.editor.append("\n"+valorfinal) 
예제 #3
0
    def traducir(self, ent, arbol, ventana):
        simbolo = ent.obtener(str(self.id))
        if (simbolo == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, No existe la variable con identificador " +
                self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None
        strAccesos = ""
        for llave in self.llaves:
            expresion = llave.traducir(ent, arbol, ventana)
            if (expresion == None): return None

            if (expresion.codigo3D != ""):
                ventana.editor.append("\n" + expresion.codigo3D)
            temporal = expresion.temporal.utilizar()
            if ' ' in temporal:
                temp2 = Temp.nuevoTemporal(1)
                ventana.editor.append("\n" + temp2.utilizar() + " = " +
                                      temporal + ";")
                temporal = temp2.utilizar()

            strAccesos += "[" + temporal + "]"

        resultado3D = Resultado3D()
        resultado3D.codigo3D = ""
        resultado3D.tipo = simbolo.tipo
        resultado3D.temporal = Temporal(simbolo.temporal + strAccesos)
        return resultado3D
예제 #4
0
파일: Imprimir.py 프로젝트: harias25/MinorC
    def concatenar(self,cadena, llave, valor):

        pos = cadena.index("%")
        pos2 = cadena.index(llave)
        if (pos == -1 or pos2 == -1):
            error = Error("SEMANTICO","Error semantico, La expresión es incorrecta para imprimir.",self.linea,self.columna)
            ReporteErrores.func(error)
            return None
        
        if (pos == pos2):
            cadena = cadena.replace(llave, valor,1)
        else:
            error = Error("SEMANTICO","Error semantico, La expresión es incorrecta para imprimir.",self.linea,self.columna)
            ReporteErrores.func(error)
            return None
        
        return cadena
예제 #5
0
파일: Unset.py 프로젝트: harias25/Augus
    def ejecutar(self,ent,arbol,ventana,isDebug):
        simbolo = ent.obtener(str(self.id)) 
        if(simbolo == None):
            error = Error("SEMANTICO","Error semantico, El identificador "+str(self.id)+" no existe!!",self.linea,self.columna)
            ReporteErrores.func(error)
        else:

            if(self.id == "$ra" or self.id == "$sp"):
                error = Error("SEMANTICO","Error semantico, No es permitido eliminar la variable "+str(self.id)+" ya que es una variable del sistema!!",self.linea,self.columna)
                ReporteErrores.func(error)
                return None

            if(len(simbolo.punteros)>0):
                for var in simbolo.punteros:
                    simboloP = ent.obtener(str(var))
                    simboloP.valor = simbolo.valor
                    simboloP.puntero = ""
                    ent.reemplazar(simboloP)
                   
            ent.eliminar(str(self.id))
예제 #6
0
파일: GoTo.py 프로젝트: harias25/Augus
    def ejecutar(self,ent,arbol,ventana,isDebug):
        etiqueta = arbol.obtenerEtiqueta(self.id)

        if(etiqueta == None):
            error = Error("SEMANTICO","Error semantico, no existe la etiqueta "+self.id,self.linea,self.columna)
            ReporteErrores.func(error)
        else:
            etiqueta.ejecutar(ent,arbol,ventana,isDebug)
           # if(type(resultado) is Exit.Exit): 
            #    return resultado   
            return True

        return False
예제 #7
0
    def getValorImplicito(self, ent, arbol):
        simbolo = ent.obtener(str(self.id))
        if (simbolo == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, No existe la variable con identificador " +
                self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        valorIdentificador = simbolo.valor
        for llave in self.llaves:
            valor = llave.getValorImplicito(ent, arbol)
            if (isinstance(valor, float)): valor = int(valor)

            if (isinstance(valorIdentificador, str)):  #cadenas
                if (isinstance(valor, int)):
                    if (valor >= len(valorIdentificador)):
                        error = Error(
                            "SEMANTICO",
                            "Error semantico, El indice excede el tamaño de la cadena",
                            self.linea, self.columna)
                        ReporteErrores.func(error)
                        return None
                    valorIdentificador = valorIdentificador[valor]
                else:
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, Llave no valida para obtener caracteres de una cadena",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None
            elif (isinstance(valorIdentificador, dict)):  #diccionarios
                if (isinstance(valor, dict)):
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, Llave no valida para obtener valor del Array",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None
                if valor not in valorIdentificador.keys():
                    error = Error(
                        "SEMANTICO", "Error semantico, Llave " + str(valor) +
                        " no existente en el Array", self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None
                else:
                    valorIdentificador = valorIdentificador[valor]
            else:
                error = Error(
                    "SEMANTICO",
                    "Error semantico, el valor del acceso no es de tipo CADENA O ARRAY",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        return valorIdentificador
예제 #8
0
파일: If.py 프로젝트: harias25/Augus
    def ejecutar(self, ent, arbol, ventana, isDebug):
        resultado = self.condicion.getValorImplicito(ent, arbol)
        if (resultado == 0 or resultado == 0.0): resultado = False
        if (resultado == 1 or resultado == 1.0): resultado = True

        if (not isinstance(resultado, bool)):
            error = Error(
                "SEMANTICO",
                "Error semantico, Se esperaba un valor 1 o 0 para validar el IF.",
                self.linea, self.columna)
            ReporteErrores.func(error)

        if (bool(resultado)):
            # try:
            return self.instruccionV.ejecutar(ent, arbol, ventana, isDebug)
        # except:
        #     return False

        return False
예제 #9
0
 def ejecutar(self,ent,arbol,ventana,isDebug):
     valor = self.cad.getValorImplicito(ent,arbol)
     if(isinstance(valor,dict)):
         error = Error("SEMANTICO","Error semantico, no es posible imprimir un Array!!",self.linea,self.columna)
         ReporteErrores.func(error)
     elif(valor == None):
         return False
     elif(str(valor) == "\n"):
         print('> ', "")
         ventana.consola.appendPlainText("")
     else:
         print('> ', valor)
         cadenas = str(valor).split("\\n")
         
         if(len(cadenas) == 1):
              ventana.consola.insertPlainText(str(valor))
         else:
             contador = 1
             for value in cadenas:
                 ventana.consola.insertPlainText(str(value))
                 if(contador < len(cadenas)):
                     ventana.consola.appendPlainText("")
                 contador = contador + 1
예제 #10
0
 def traducir(self, ent, arbol, ventana):
     if (ent.existe(self.id)):
         error = Error(
             "SEMANTICO",
             "Error semantico, ya se encuentra definido un parametro con el nombre "
             + id, self.linea, self.columna)
         ReporteErrores.func(error)
         return None
     else:
         if (self.valor == None):
             temporal = temp.parametro()
             simbolo = Simbolo(self.id, temporal, self.tipo, self.linea,
                               self.columna)
             ent.agregar(simbolo)
             return temporal
         else:
             simbolo = Simbolo(self.id, self.temporal, self.tipo,
                               self.linea, self.columna)
             ent.agregar(simbolo)
             ref = ""
             if (self.referencia): ref = "&"
             asignacion = Asignacion(self.id, self.valor, self.linea,
                                     self.columna, ref)
             asignacion.traducir(ent, arbol, ventana)
예제 #11
0
    def traducir(self, ent, arbol, ventana):
        funcion = arbol.obtenerEtiqueta(self.id)
        if (funcion == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, no se encuentra definida una Función con el nombre "
                + self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        if (len(funcion.parametros) != len(funcion.temporales)):
            error = Error(
                "SEMANTICO",
                "Error semantico, no se encuentra definida una Función con el nombre "
                + self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        if (len(funcion.parametros) != len(self.expresiones)):
            error = Error(
                "SEMANTICO",
                "Error semantico, El número de parametros no son iguales a los definidos en la función "
                + self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        enLlamada = TS.Entorno(ent)
        contador = 0
        #funcion.calcularNiveles(funcion.instrucciones)
        #cantidad = temp.listaRecusion(None,None).count(self.id)

        for parametro in funcion.parametros:
            parametro.valor = self.expresiones[contador]
            parametro.temporal = funcion.temporales[contador]
            parametro.traducir(enLlamada, arbol, ventana)
            contador = contador + 1

        #llamadaAnterior = temp.listaLLamada(1,None)
        #recursionAnterior = temp.listaRecusion(1,None)

        #llamadaPrevia = temp.listaLLamada(1,None)
        #if(recursionAnterior==self.id):

        llamadaAnterior = temp.listaLLamada(1, None)  #
        recursionAnterior = temp.listaRecusion(1, None)  #
        # if(cantidad<funcion.nivelesRecursiva):
        #     etiquetaFuncion = temp.etiqueta()
        #     etiquetaSalida = temp.etiqueta()
        #     temp.listaLLamada(0,etiquetaFuncion)
        #     temp.listaRecusion(0,self.id)
        #     funcion.entorno = enLlamada
        #     funcion.etiqueta = etiquetaFuncion
        #     ventana.editor.append("\n"+"goto "+etiquetaFuncion+";")
        #     funcion.traducir(ent,arbol,ventana)
        #     ventana.editor.append("\n"+etiquetaSalida+":")
        #     temp.listaLLamada(2,etiquetaFuncion)
        #     temp.listaRecusion(2,self.id)
        # #else:
        #     if(llamadaPrevia!=None):
        #         if(llamadaAnterior!=llamadaPrevia):
        #             ventana.editor.append("\n"+"goto "+llamadaPrevia+";")

        #    #else:
        #        #ventana.editor.append("\n"+"goto "+llamadaAnterior+";")
        #else:
        if (not recursionAnterior == self.id):
            etiquetaFuncion = temp.etiqueta()
            etiquetaSalida = temp.etiqueta()
            temp.listaLLamada(0, etiquetaFuncion)
            temp.listaRecusion(0, self.id)
            funcion.entorno = enLlamada
            funcion.etiqueta = etiquetaFuncion
            ventana.editor.append("\n" + "goto " + etiquetaFuncion + ";")
            funcion.traducir(ent, arbol, ventana)
            ventana.editor.append("\n" + etiquetaSalida + ":")
            temp.listaLLamada(2, etiquetaFuncion)
            temp.listaRecusion(2, self.id)
        else:  #
            ventana.editor.append("\n" + "goto " + llamadaAnterior + ";")  #

        arbol.entornoGlobal.tabla = {
            **enLlamada.tabla,
            **arbol.entornoGlobal.tabla
        }
예제 #12
0
    def ejecutar(self, ent, arbol, ventana, isDebug):
        simbolo = ent.obtener(str(self.id))
        if (simbolo == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, No existe la variable con identificador " +
                self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return False

        valorIdentificador = simbolo.valor

        valorAgregar = None
        if not self.defArray:
            valorAgregar = self.asignacion.getValorImplicito(ent, arbol)

        if (valorAgregar == None and not self.defArray): return False

        for llave in self.llaves:
            valor = llave.getValorImplicito(ent, arbol)
            if (valor == None): return False
            if (isinstance(valor, float)): valor = int(valor)

            if (not isinstance(valorIdentificador, dict) and self.defArray):
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Solo pueden inicializarse array dento de arrays",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return False

            if (isinstance(valorIdentificador, str)):  #cadenas
                if len(self.llaves) > 1:
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, No puede usarse acceso [..][..]... para asignación de Cadenas",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return False

                if (isinstance(valorAgregar, float)):
                    valorAgregar = int(valorAgregar)
                if (isinstance(valorAgregar, dict)):
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, Valor no valido para asignar caracteres de una cadena",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return False
                if (isinstance(valor, int)):
                    if (valor <= (len(valorIdentificador) - 1)):
                        valorAgregar = str(valorAgregar)[0]
                        valorIdentificador = valorIdentificador[
                            0:valor] + valorAgregar + valorIdentificador[
                                valor + 1:len(valorIdentificador)]
                    else:
                        while (len(valorIdentificador) - 1) != valor - 1:
                            valorIdentificador = valorIdentificador + ' '

                        valorAgregar = str(valorAgregar)[0]
                        valorIdentificador = valorIdentificador + valorAgregar

                    asignar = Asignacion(self.id,
                                         Primitivo(valorIdentificador, 0, 0),
                                         self.linea, self.columna, False)
                    asignar.ejecutar(ent, arbol, ventana, isDebug)
                else:
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, Llave no valida para asingar caracteres de una cadena",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return False
            elif (isinstance(valorIdentificador, dict)):  #diccionarios
                valorFinal = self.asignarValorEnArray(ent, valorIdentificador,
                                                      valorAgregar, 1)
                if (valorFinal == None): return False
                asignar = Asignacion(self.id,
                                     Primitivo(valorIdentificador, 0, 0),
                                     self.linea, self.columna, False)
                asignar.ejecutar(ent, arbol, ventana, isDebug)
            else:
                error = Error(
                    "SEMANTICO",
                    "Error semantico, el valor del acceso no es de tipo CADENA O ARRAY",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return False
예제 #13
0
    def asignarValorEnArray(self, ent, diccionario, valorAgregar, pos):
        temporal = diccionario

        if ((isinstance(temporal, int) or isinstance(temporal, float))
                and pos > 1):
            error = Error(
                "SEMANTICO",
                "Error semantico, Ya se encuentra ocupado el indice.",
                self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        if (len(self.llaves) < pos): return None

        llave = self.llaves[pos - 1]
        valor = llave.getValorImplicito(ent, None)

        if (valor == None): return None
        if (isinstance(valor, float)): valor = int(valor)

        if (len(self.llaves) == pos):
            if (isinstance(temporal, dict)):
                if (self.defArray):
                    temporal[valor] = {}
                else:
                    temporal[valor] = valorAgregar
            elif isinstance(temporal, str):
                if (self.defArray):
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, solo pueden inicializarse array dento de arrays",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None
                else:
                    if (isinstance(valor, int)):
                        if (valor <= (len(temporal) - 1)):
                            valorAgregar = str(valorAgregar)[0]
                            temporal = temporal[
                                0:valor] + valorAgregar + temporal[
                                    valor + 1:len(temporal)]
                        else:
                            while (len(temporal) - 1) != valor - 1:
                                temporal = temporal + ' '

                            valorAgregar = str(valorAgregar)[0]
                            temporal = temporal + valorAgregar

                        return temporal
                    else:
                        error = Error(
                            "SEMANTICO",
                            "Error semantico, Llave no valida para asingar caracteres de una cadena",
                            self.linea, self.columna)
                        ReporteErrores.func(error)
                        return None
            return temporal
        else:
            if (isinstance(temporal, dict)):
                if valor not in temporal.keys():
                    temporal[valor] = {}
            else:
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Asignación incorrecta a un valor que no es un Array",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        resultado = self.asignarValorEnArray(ent, temporal[valor],
                                             valorAgregar, pos + 1)
        if (resultado == None and isinstance(temporal[valor], dict)):
            return diccionario
        if (resultado == None and not isinstance(temporal[valor], dict)):
            return None
        diccionario[valor] = resultado
        return diccionario
예제 #14
0
    def traducir(self, ent, arbol, ventana):
        accesoLista = None
        if (isinstance(self.id, AccesoLista)):
            accesoLista = self.id
            self.id = self.id.id

        simbolo = ent.obtener(str(self.id))
        if (simbolo == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, No es existe la variable " + str(self.id),
                self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        if (simbolo.tipo == Tipo.DOOBLE or simbolo.tipo == Tipo.ENTERO
                or simbolo.tipo == Tipo.FLOAT or simbolo.tipo == Tipo.CHAR):
            error = Error(
                "SEMANTICO", "Error semantico, La variable " + str(self.id) +
                " no es un Struct.", self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        struct = arbol.obtenerStruct(simbolo.tipo)
        if (struct == None):
            error = Error(
                "SEMANTICO", "Error semantico, El struct " +
                str(simbolo.tipo) + " no se encuentra definido.", self.linea,
                self.columna)
            ReporteErrores.func(error)
            return None

        bandera = False
        for declaracion in struct.declaraciones:
            #if(simbolo.tipo == Tipo.DOOBLE or simbolo.tipo == Tipo.ENTERO or simbolo.tipo == Tipo.FLOAT or simbolo.tipo == Tipo.CHAR):  #primitivos basicos
            for x in declaracion.lista:
                if (isinstance(x, AccesoLista)):
                    x = x.id

                key = self.llave
                if (isinstance(key, AccesoLista)): key = key.id
                if (x == key):
                    bandera = True
                    break

        if (not bandera):
            error = Error(
                "SEMANTICO",
                "Error semantico, El struct " + str(simbolo.tipo) +
                " no tiene definido el atributo " + self.llave, self.linea,
                self.columna)
            ReporteErrores.func(error)
            return None

        temporal = temp.nuevoTemporal()

        temporalSimbolo = simbolo.temporal

        if (accesoLista != None):
            traduccionAccesoLista = accesoLista.traducir(ent, arbol, ventana)
            temporalSimbolo = traduccionAccesoLista.temporal.utilizar()

        if isinstance(self.llave, AccesoLista):
            resultado3D = Resultado3D()

            strAccesos = ""
            for llave in self.llave.llaves:
                expresion = llave.traducir(ent, arbol, ventana)
                if (expresion == None): return None

                if (expresion.codigo3D != ""):
                    ventana.editor.append("\n" + expresion.codigo3D)
                strAccesos += "[" + expresion.temporal.utilizar() + "]"

            resultado3D.codigo3D = temporalSimbolo + "[\"" + self.llave.id + "\"]" + strAccesos
            resultado3D.tipo = simbolo.tipo
            resultado3D.temporal = temporal
            return resultado3D
        else:
            resultado3D = Resultado3D()
            resultado3D.codigo3D = temporalSimbolo + "[\"" + self.llave + "\"]"
            resultado3D.tipo = simbolo.tipo
            resultado3D.temporal = temporal
            return resultado3D
예제 #15
0
    def traducir(self, ent, arbol, ventana):
        contador = 0
        for id in self.lista:
            llaves = None
            if (isinstance(id, AccesoLista)):
                llaves = id.llaves
                id = id.id

            #validar si existe el simbolo dentro de la tabla
            if (ent.existeLocal(id)):
                error = Error(
                    "SEMANTICO",
                    "Error semantico, ya se encuentra declarado un identificador con el nombre "
                    + id, self.linea, self.columna)
                ReporteErrores.func(error)
                return None
            else:
                traduccion = ""
                temporal = temp.temporal()
                simbolo = Simbolo(id, temporal, self.tipo, self.linea,
                                  self.columna)
                simbolo.llaves = llaves

                if (llaves != None):
                    traduccion = temporal + "=array();"
                    ent.agregar(simbolo)
                    ventana.editor.append("\n" + traduccion)

                    if (self.valor != None and contador
                            == (len(self.lista) - 1)):  #asignacion de array
                        asignacion = Asignacion(id, self.valor, self.linea,
                                                self.columna)
                        asignacion.traducir(ent, arbol, ventana)

                else:  #identificadores y structs
                    if (self.valor == None
                            or (self.valor != None and contador <
                                (len(self.lista) - 1))):

                        if (self.adicional != ""):
                            traduccion = temporal + "=" + self.adicional + ";"
                        elif (self.tipo == Tipo.ENTERO):
                            traduccion = temporal + "=0;"
                        elif (self.tipo == Tipo.FLOAT):
                            traduccion = temporal + "=0.0;"
                        elif (self.tipo == Tipo.CHAR):
                            traduccion = temporal + "='';"
                        else:
                            struct = arbol.obtenerStruct(self.tipo)
                            if (struct == None):
                                error = Error(
                                    "SEMANTICO",
                                    "Error semantico, no se encuentra declarado un struct con el nombre "
                                    + self.tipo, self.linea, self.columna)
                                ReporteErrores.func(error)
                                return None

                            traduccion = temporal + "=array();"

                        ent.agregar(simbolo)
                        ventana.editor.append("\n" + traduccion)
                    else:
                        ent.agregar(simbolo)
                        asignacion = Asignacion(id, self.valor, self.linea,
                                                self.columna, self.adicional)
                        asignacion.traducir(ent, arbol, ventana)
            contador = contador + 1
예제 #16
0
    def getValorImplicito(self, ent, arbol):
        #PRIMITIVOS
        if (self.tipo == TIPO_OPERACION.PRIMITIVO):
            return self.valor.getValorImplicito(ent, arbol)

        #ACCESOS LISTAS
        elif (self.tipo == TIPO_OPERACION.ACCESO):
            return self.operadorIzq.getValorImplicito(ent, arbol)
        #IDENTIFICADORES
        elif (self.tipo == TIPO_OPERACION.ID):
            simbolo = ent.obtener(str(self.valor))
            if (simbolo == None):
                error = Error(
                    "SEMANTICO", "Error semantico, No es existe la variable " +
                    str(self.valor), self.linea, self.columna)
                ReporteErrores.func(error)
                return None

            valorRetorno = simbolo.getValorImplicito(ent, arbol)
            if (type(valorRetorno) is Operacion):
                return valorRetorno.getValorImplicito(ent, arbol)
            return valorRetorno

        #SUMA
        elif (self.tipo == TIPO_OPERACION.SUMA):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #concatenación de strings
            if (isinstance(valor1, str) and isinstance(valor2, str)):
                return valor1 + valor2

            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(valor1) + int(valor2)
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return round(float(float(valor1) + float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return round(float(float(valor1) + float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return round(float(float(valor1) + float(valor2)), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una SUMA",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #RESTA
        elif (self.tipo == TIPO_OPERACION.RESTA):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)
            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(valor1) - int(valor2)
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return round(float(float(valor1) - float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return round(float(float(valor1) - float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return round(float(float(valor1) - float(valor2)), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una RESTA",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MULTIPLICACIÓN
        elif (self.tipo == TIPO_OPERACION.MULTIPLICACION):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)
            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(valor1) * int(valor2)
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return round(float(float(valor1) * float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return round(float(float(valor1) * float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return round(float(float(valor1) * float(valor2)), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una MULTIPLICACION",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #DIVISION
        elif (self.tipo == TIPO_OPERACION.DIVISION):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            if (isinstance(valor2, int) or isinstance(valor2, float)):
                temp = int(valor2)
                if (temp == 0):
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, No es posible una división sobre CERO!",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(valor1) / int(valor2)
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return round(float(float(valor1) / float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return round(float(float(valor1) / float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return round(float(float(valor1) / float(valor2)), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una DIVISION",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MODULO
        elif (self.tipo == TIPO_OPERACION.MODULO):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            if (isinstance(valor2, int) or isinstance(valor2, float)):
                temp = int(valor2)
                if (temp == 0):
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, No es posible una modulo sobre CERO!",
                        self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(valor1) % int(valor2)
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return round(float(float(valor1) % float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return round(float(float(valor1) % float(valor2)), 2)
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return round(float(float(valor1) % float(valor2)), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una MODULO",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #UNARIA
        elif (self.tipo == TIPO_OPERACION.MENOS_UNARIO):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int):
                return int(valor1) * -1
            elif isinstance(valor1, float):  # FLOAT
                return round(float(float(valor1) * -1), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipo de dato permitido para un UNARIO",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #ABSOLUTO
        elif (self.tipo == TIPO_OPERACION.ABSOLUTO):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int):
                return abs(int(valor1))
            elif isinstance(valor1, float):  # FLOAT
                return round(abs(float(float(valor1))), 2)
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipo de dato permitido para un VALOR ABSOLUTO",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MAYOR
        elif (self.tipo == TIPO_OPERACION.MAYOR_QUE):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) > int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int(float(valor1) > float(valor2))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int(float(valor1) > float(valor2))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int(float(valor1) > float(valor2))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                if isinstance(valor1, str) and not isinstance(valor2, str):
                    return int(len(str(valor1)) > valor2)
                elif isinstance(valor2, str) and not isinstance(valor1, str):
                    return int(valor1 > len(str(valor2)))
                return int(len(str(valor1)) > len(str(valor2)))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '>' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MAYOR IGUAL
        elif (self.tipo == TIPO_OPERACION.MAYOR_IGUA_QUE):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) >= int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int(float(valor1) >= float(valor2))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int(float(valor1) >= float(valor2))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int(float(valor1) >= float(valor2))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                if isinstance(valor1, str) and not isinstance(valor2, str):
                    return int(len(str(valor1)) >= valor2)
                elif isinstance(valor2, str) and not isinstance(valor1, str):
                    return int(valor1 >= len(str(valor2)))
                return int(len(str(valor1)) >= len(str(valor2)))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '>=' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MENOR
        elif (self.tipo == TIPO_OPERACION.MENOR_QUE):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) < int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int((float(valor1) < float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int((float(valor1) < float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int((float(valor1) < float(valor2)))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                if isinstance(valor1, str) and not isinstance(valor2, str):
                    return int(len(str(valor1)) < valor2)
                elif isinstance(valor2, str) and not isinstance(valor1, str):
                    return int(valor1 < len(str(valor2)))
                return int(len(str(valor1)) < len(str(valor2)))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '<' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #MENOR IGUAL
        elif (self.tipo == TIPO_OPERACION.MENOR_IGUA_QUE):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) <= int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int((float(valor1) <= float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int((float(valor1) <= float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int((float(valor1) <= float(valor2)))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                if isinstance(valor1, str) and not isinstance(valor2, str):
                    return int(len(str(valor1)) <= valor2)
                elif isinstance(valor2, str) and not isinstance(valor1, str):
                    return int(valor1 <= len(str(valor2)))
                return int(len(str(valor1)) <= len(str(valor2)))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '<=' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #IGUAL
        elif (self.tipo == TIPO_OPERACION.IGUAL_IGUAL):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) == int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int((float(valor1) == float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int((float(valor1) == float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int((float(valor1) == float(valor2)))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                return int(str(valor1) == str(valor2))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '==' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #DIFERENTE
        elif (self.tipo == TIPO_OPERACION.DIFERENTE_QUE):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)

            #OPERACION DE ENTEROS
            if isinstance(valor1, int) and isinstance(valor2, int):
                return int(int(valor1) != int(valor2))
            elif isinstance(valor1, int) and isinstance(
                    valor2, float):  # ENTERO - FLOAT
                return int((float(valor1) != float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, int):  # FLOAT - ENTERO
                return int((float(valor1) != float(valor2)))
            elif isinstance(valor1, float) and isinstance(
                    valor2, float):  # FLOAT - FLOAT
                return int((float(valor1) != float(valor2)))
            elif isinstance(valor1, str) or isinstance(
                    valor2, str):  # CONCATENACIÓN STRINGS
                if valor1 == None: valor1 = ""
                if valor2 == None: valor2 = ""
                return int(str(valor1) != str(valor2))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion relacional '!=' ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #AND
        elif (self.tipo == TIPO_OPERACION.AND):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (valor1 == 0 or valor1 == 0.0): valor1 = False
            if (valor1 == 1 or valor1 == 1.0): valor1 = True

            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (valor2 == 0 or valor2 == 0.0): valor2 = False
            if (valor2 == 1 or valor2 == 1.0): valor2 = True

            if isinstance(valor1, bool) and isinstance(valor2, bool):
                return int(bool(valor1) and bool(valor2))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion logica AND ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #OR
        elif (self.tipo == TIPO_OPERACION.OR):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (valor1 == 0 or valor1 == 0.0): valor1 = False
            if (valor1 == 1 or valor1 == 1.0): valor1 = True

            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (valor2 == 0 or valor2 == 0.0): valor2 = False
            if (valor2 == 1 or valor2 == 1.0): valor2 = True

            if isinstance(valor1, bool) and isinstance(valor2, bool):
                return int(bool(valor1) or bool(valor2))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion logica OR ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #XOR
        elif (self.tipo == TIPO_OPERACION.XOR):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (valor1 == 0 or valor1 == 0.0): valor1 = False
            if (valor1 == 1 or valor1 == 1.0): valor1 = True

            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (valor2 == 0 or valor2 == 0.0): valor2 = False
            if (valor2 == 1 or valor2 == 1.0): valor2 = True

            if isinstance(valor1, bool) and isinstance(valor2, bool):
                return int(bool(valor1) ^ bool(valor2))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipos de datos permitidos para una expresion logica XOR ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return None

        #NOT
        elif (self.tipo == TIPO_OPERACION.NOT):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (valor1 == 0 or valor1 == 0.0): valor1 = False
            if (valor1 == 1 or valor1 == 1.0): valor1 = True

            if isinstance(valor1, bool):
                return int(not bool(valor1))
            else:
                #ERROR DE TIPOS DE DATOS PERMITIDOS PARA LA OPERACION
                error = Error(
                    "SEMANTICO",
                    "Error semantico, Error en tipo de dato permitido para una expresion logica NOT ",
                    self.linea, self.columna)
                ReporteErrores.func(error)
                return

        #PAND
        elif (self.tipo == TIPO_OPERACION.PAND):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            valor1 = int(valor1)
            valor2 = int(valor2)

            return valor1 & valor2

        #BOR
        elif (self.tipo == TIPO_OPERACION.BOR):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            valor1 = int(valor1)
            valor2 = int(valor2)

            return valor1 | valor2

        #XORR
        elif (self.tipo == TIPO_OPERACION.XORR):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            valor1 = int(valor1)
            valor2 = int(valor2)

            return valor1 ^ valor2

        #SHIFI
        elif (self.tipo == TIPO_OPERACION.SHIFTI):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            valor1 = int(valor1)
            valor2 = int(valor2)

            return valor1 << valor2

        #SHIFD
        elif (self.tipo == TIPO_OPERACION.SHIFTD):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            valor2 = self.operadorDer.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            if (isinstance(valor2, str)):
                valor2 = self.obtenerValorNumerico(valor2)

            valor1 = int(valor1)
            valor2 = int(valor2)

            return valor1 >> valor2

        #NOTR
        elif (self.tipo == TIPO_OPERACION.NOTR):
            valor1 = self.operadorIzq.getValorImplicito(ent, arbol)
            if (isinstance(valor1, str)):
                valor1 = self.obtenerValorNumerico(valor1)
            valor1 = int(valor1)
            return ~valor1
예제 #17
0
    def traducir(self, ent, arbol, ventana, recursivo=0):
        #PRIMITIVOS
        if (self.tipo == TIPO_OPERACION.PRIMITIVO):
            return self.valor.traducir(ent, arbol)

        #ACCESOS LISTAS
        elif (self.tipo == TIPO_OPERACION.ACCESO):
            valor = self.operadorIzq.traducir(ent, arbol, ventana)
            if (valor == None): return None
            return valor

        elif (self.tipo == TIPO_OPERACION.ACCESO_STRUCT):
            valor = self.operadorIzq.traducir(ent, arbol, ventana)
            if (valor == None): return None
            valor.codigo3D = valor.temporal.utilizar(
            ) + "=" + valor.codigo3D + ";"
            return valor

        elif (self.tipo == TIPO_OPERACION.LLAMADA):

            #etiquetaSalida = Temp.etiqueta()
            #Temp.listaReturn(0,etiquetaSalida)
            self.operadorIzq.traducir(ent, arbol, ventana)
            #ventana.editor.append("\n"+etiquetaSalida+":")
            result = Resultado3D()
            result.codigo3D = ""
            result.temporal = Temp.Temporal("$v0")
            result.tipo = Tipo.FLOAT
            return result

        #IDENTIFICADORES
        elif (self.tipo == TIPO_OPERACION.ID):
            simbolo = ent.obtener(str(self.valor))
            if (simbolo == None):
                error = Error(
                    "SEMANTICO", "Error semantico, No es existe la variable " +
                    str(self.valor), self.linea, self.columna)
                ReporteErrores.func(error)
                return None

            return simbolo.traducir(ent, arbol)

        #SUMA
        elif (self.tipo == TIPO_OPERACION.SUMA):
            return self.generarOperacionBinaria("+", ent, arbol, ventana,
                                                recursivo)

        #RESTA
        elif (self.tipo == TIPO_OPERACION.RESTA):
            return self.generarOperacionBinaria("-", ent, arbol, ventana,
                                                recursivo)

        #MULTIPLICACIÓN
        elif (self.tipo == TIPO_OPERACION.MULTIPLICACION):
            return self.generarOperacionBinaria("*", ent, arbol, ventana,
                                                recursivo)

        #DIVISION
        elif (self.tipo == TIPO_OPERACION.DIVISION):
            return self.generarOperacionBinaria("/", ent, arbol, ventana,
                                                recursivo)

        #MODULO
        elif (self.tipo == TIPO_OPERACION.MODULO):
            return self.generarOperacionBinaria("%", ent, arbol, ventana,
                                                recursivo)

        #UNARIA
        elif (self.tipo == TIPO_OPERACION.MENOS_UNARIO):
            valor1 = self.operadorIzq.traducir(ent, arbol, ventana,
                                               recursivo + 1)
            if (valor1 == None): return None
            temporal = Temp.nuevoTemporal()
            op = temporal.obtener() + '=-' + valor1.temporal.utilizar() + ";"

            resultado = valor1.codigo3D
            if (resultado != ""):
                resultado = resultado + "\n" + op
            else:
                resultado += op

            result = Resultado3D()
            result.codigo3D = resultado
            result.temporal = temporal
            result.tipo = Tipo.FLOAT
            return result

        #MAYOR
        elif (self.tipo == TIPO_OPERACION.MAYOR_QUE):
            return self.generarOperacionBinaria(">", ent, arbol, ventana,
                                                recursivo)

        #MAYOR IGUAL
        elif (self.tipo == TIPO_OPERACION.MAYOR_IGUA_QUE):
            return self.generarOperacionBinaria(">=", ent, arbol, ventana,
                                                recursivo)
        #MENOR
        elif (self.tipo == TIPO_OPERACION.MENOR_QUE):
            return self.generarOperacionBinaria("<", ent, arbol, ventana,
                                                recursivo)

        #MENOR IGUAL
        elif (self.tipo == TIPO_OPERACION.MENOR_IGUA_QUE):
            return self.generarOperacionBinaria("<=", ent, arbol, ventana,
                                                recursivo)

        #IGUAL
        elif (self.tipo == TIPO_OPERACION.IGUAL_IGUAL):
            return self.generarOperacionBinaria("==", ent, arbol, ventana,
                                                recursivo)

        #DIFERENTE
        elif (self.tipo == TIPO_OPERACION.DIFERENTE_QUE):
            return self.generarOperacionBinaria("!=", ent, arbol, ventana,
                                                recursivo)

        #AND
        elif (self.tipo == TIPO_OPERACION.AND):
            return self.generarOperacionBinaria("&&", ent, arbol, ventana,
                                                recursivo)

        #OR
        elif (self.tipo == TIPO_OPERACION.OR):
            return self.generarOperacionBinaria("||", ent, arbol, ventana,
                                                recursivo)
        #XOR
        elif (self.tipo == TIPO_OPERACION.XOR):
            return self.generarOperacionBinaria("xor", ent, arbol, ventana,
                                                recursivo)

        #NOT
        elif (self.tipo == TIPO_OPERACION.NOT):
            valor1 = self.operadorIzq.traducir(ent, arbol, ventana,
                                               recursivo + 1)
            if (valor1 == None): return None
            temporal = Temp.nuevoTemporal()
            op = temporal.obtener() + '=!' + valor1.temporal.utilizar() + ";"

            resultado = valor1.codigo3D
            if (resultado != ""):
                resultado = resultado + "\n" + op
            else:
                resultado += op

            result = Resultado3D()
            result.codigo3D = resultado
            result.temporal = temporal
            result.tipo = Tipo.FLOAT
            return result

        #PAND
        elif (self.tipo == TIPO_OPERACION.PAND):
            return self.generarOperacionBinaria("&", ent, arbol, ventana,
                                                recursivo)

        #BOR
        elif (self.tipo == TIPO_OPERACION.BOR):
            return self.generarOperacionBinaria("|", ent, arbol, ventana,
                                                recursivo)

        #XORR
        elif (self.tipo == TIPO_OPERACION.XORR):
            return self.generarOperacionBinaria("^", ent, arbol, ventana,
                                                recursivo)

        #SHIFI
        elif (self.tipo == TIPO_OPERACION.SHIFTI):
            return self.generarOperacionBinaria("<<", ent, arbol, ventana,
                                                recursivo)

        #SHIFD
        elif (self.tipo == TIPO_OPERACION.SHIFTD):
            return self.generarOperacionBinaria(">>", ent, arbol, ventana,
                                                recursivo)

        #NOTR
        elif (self.tipo == TIPO_OPERACION.NOTR):
            valor1 = self.operadorIzq.traducir(ent, arbol, ventana,
                                               recursivo + 1)
            if (valor1 == None): return None
            temporal = Temp.nuevoTemporal()
            op = temporal.obtener() + '=~' + valor1.temporal.utilizar() + ";"

            resultado = valor1.codigo3D
            if (resultado != ""):
                resultado = resultado + "\n" + op
            else:
                resultado += op

            result = Resultado3D()
            result.codigo3D = resultado
            result.temporal = temporal
            result.tipo = Tipo.FLOAT
            return result
예제 #18
0
    def traducir(self, ent, arbol, ventana):
        #acceso a struct
        if (isinstance(self.id, AccesoStruct)
                or isinstance(self.id, AccesoLista)):
            traduccionExpresion = self.valor.traducir(ent, arbol, ventana)
            if (traduccionExpresion == None): return None

            acceso = self.id.traducir(ent, arbol, ventana)
            if (acceso == None): return None

            if (traduccionExpresion.codigo3D != ""):
                ventana.editor.append("\n" + traduccionExpresion.codigo3D)
            if (isinstance(self.id, AccesoStruct)):
                ventana.editor.append("\n" + acceso.codigo3D + "=" +
                                      self.tipo +
                                      traduccionExpresion.temporal.utilizar() +
                                      "; ")
            else:
                ventana.editor.append("\n" + acceso.temporal.utilizar() + "=" +
                                      self.tipo +
                                      traduccionExpresion.temporal.utilizar() +
                                      "; ")

            return None

        simbolo = ent.obtener(str(self.id))
        if (simbolo == None):
            error = Error(
                "SEMANTICO",
                "Error semantico, no se encuentra declarado un identificador con el nombre "
                + self.id, self.linea, self.columna)
            ReporteErrores.func(error)
            return None

        if (simbolo.llaves != None):  #array
            if (isinstance(self.valor, list)):
                self.operacionesArray(ent, arbol, ventana, self.valor,
                                      simbolo.temporal, "")
            else:
                traduccionExpresion = self.valor.traducir(ent, arbol, ventana)
                if (traduccionExpresion == None): return None

                if (simbolo.tipo == Tipo.CHAR
                        and traduccionExpresion.tipo == Tipo.CHAR):
                    if (traduccionExpresion.codigo3D != ""):
                        ventana.editor.append("\n" +
                                              traduccionExpresion.codigo3D)
                    traduccion = simbolo.temporal + "=" + self.tipo + traduccionExpresion.temporal.utilizar(
                    ) + "; "
                    ventana.editor.append("\n" + traduccion)
                else:
                    error = Error(
                        "SEMANTICO",
                        "Error semantico, expresión incorrecta al asignar el Arrray "
                        + self.id, self.linea, self.columna)
                    ReporteErrores.func(error)
                    return None

        else:
            if (isinstance(self.valor, list)):
                error = Error(
                    "SEMANTICO",
                    "Error semantico, expresión incorrecta para asignar el identificador "
                    + self.id, self.linea, self.columna)
                ReporteErrores.func(error)
                return None

            traduccionExpresion = self.valor.traducir(ent, arbol, ventana)
            if (traduccionExpresion == None): return None

            if (traduccionExpresion.codigo3D != ""):
                ventana.editor.append("\n" + traduccionExpresion.codigo3D)

            traduccion = simbolo.temporal + "=" + self.tipo + traduccionExpresion.temporal.utilizar(
            ) + "; "

            try:
                ventana.editor.append("\n" + traduccion)
            except:
                pass