예제 #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
파일: Ejecutor.py 프로젝트: harias25/MinorC
    def debug(self, ventana):
        self.hilo_terminado = False
        main = self.ast.obtenerEtiqueta("main")

        if (main != None):
            salir = False
            ventana.editor.setCursorPosition(0, 0)
            ventana.editor.setFocus()
            time.sleep(2)
            for ins in main.instrucciones:
                QApplication.processEvents()
                try:
                    ventana.editor.setCursorPosition(ins.linea - 1, 0)
                    ventana.editor.setFocus()
                    time.sleep(1)
                    if (isinstance(ins, Asignacion.Asignacion)
                            or isinstance(ins, Conversion.Conversion)):
                        ins.setAmbito("main")
                    if (ins.ejecutar(self.ts_global, self.ast, ventana,
                                     True) == True):
                        salir = True
                        break

                    contador = 1
                    ventana.tableWidget.setRowCount(0)
                    ventana.tableWidget.setRowCount(100)
                    ventana.tableWidget.setItem(0, 0, QTableWidgetItem("No."))
                    ventana.tableWidget.setItem(0, 1,
                                                QTableWidgetItem("Simbolo"))
                    ventana.tableWidget.setItem(0, 2,
                                                QTableWidgetItem("Valor"))
                    for key in self.ts_global.tabla:
                        s = self.ts_global.tabla[key]
                        ventana.tableWidget.setItem(
                            contador, 0, QTableWidgetItem(str(contador)))
                        ventana.tableWidget.setItem(contador, 1,
                                                    QTableWidgetItem(s.id))
                        ventana.tableWidget.setItem(
                            contador, 2, QTableWidgetItem(str(s.valor)))
                        contador = contador + 1
                except:
                    pass

            if (not salir):
                siguiente = self.ast.obtenerSiguienteEtiqueta("main")
                if (siguiente != None):
                    siguiente.ejecutar(self.ts_global, self.ast, ventana, True)
        else:
            error = Error.Error(
                "SEMANTICO",
                "Error semantico, No puede iniciarse el programa ya que no existe la etiqueta main:",
                0, 0)
            ReporteErrores.func(error)
        listado = ReporteErrores.func(None)
        if (len(listado) > 0):
            QMessageBox.critical(
                ventana.centralwidget, "Errores en Ejecución",
                "Se obtuvieron errores en la ejecución del Código Ingresado, verifique reporte de Errores"
            )
        self.hilo_terminado = True
예제 #3
0
def t_error(t):
    error = Error.Error(
        "LEXICO", "Error lexico, Caracter " + t.value[0] + " no es valido.",
        t.lexer.lineno, find_column(t))
    ReporteErrores.func(error)
    #print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)
예제 #4
0
파일: Imprimir.py 프로젝트: harias25/MinorC
    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
예제 #5
0
def p_error(t):
    try:
        error = Error.Error(
            "SINTACTICO",
            "Error sintactico, no se esperaba el valor " + t.value, t.lineno,
            find_column(t))
        ReporteErrores.func(error)
    except:
        error = Error.Error("SINTACTICO", "Error sintactico", 1, 1)
        ReporteErrores.func(error)
예제 #6
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
예제 #7
0
    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
예제 #8
0
    def ejecutar(self, ent, arbol, ventana, isDebug):
        value = self.valor.getValorImplicito(ent, arbol)

        if (isinstance(value, dict)):
            els = list(value.items())
            value = els[0][1]

        if (isinstance(value, dict)):
            error = Error.Error(
                "SEMANTICO",
                "Error semantico, La primera posición del array es otro array. ",
                self.linea, self.columna)
            ReporteErrores.func(error)
            return False

        if (self.tipo == 'int'):
            if (isinstance(value, float)):
                value = int(value)
            elif (isinstance(value, str)):
                value = ord(value[0])
            else:
                value = value

        elif (self.tipo == 'float'):
            if (isinstance(value, int)):
                value = float(value)
            elif (isinstance(value, str)):
                value = float(ord(value[0]))
            else:
                value = value
        else:
            if (isinstance(value, float)): value = int(value)
            if (isinstance(value, int)):
                if (value > 255): value = value - 256
                value = chr(value)
            elif (isinstance(value, str)):
                value = value[0]
            else:
                value = value

        primitivo = Primitivo(value, self.linea, self.columna)
        asignacion = Asignacion(self.id, primitivo, self.linea, self.columna,
                                False)
        asignacion.setAmbito(self.declarada)
        asignacion.ejecutar(ent, arbol, ventana, isDebug)

        return False
예제 #9
0
    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
        
예제 #10
0
파일: Unset.py 프로젝트: harias25/MinorC
    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))
예제 #11
0
파일: Ejecutor.py 프로젝트: harias25/MinorC
    def debugger(self, ventana):
        ventana.tableWidget.setRowCount(0)
        ventana.tableWidget.setRowCount(100)
        ventana.tableWidget.setItem(0, 0, QTableWidgetItem("No."))
        ventana.tableWidget.setItem(0, 1, QTableWidgetItem("Simbolo"))
        ventana.tableWidget.setItem(0, 2, QTableWidgetItem("Valor"))

        if (self.hilo_terminado):
            sys.setrecursionlimit(2147483644)
            ventana.consola.clear()
            ReporteErrores.func(None, True)
            g.func(0, None)
            g.textoEntrada = ventana.editor.text()
            instrucciones = g.parse(ventana.editor.text())
            self.instrucciones = instrucciones
            ts_global = TS.Entorno(None)
            ast = AST.AST(instrucciones)

            declaracion1 = Declaracion.Declaracion('$ra', 0, 0, 0, "",
                                                   "GLOBAL")
            declaracion2 = Declaracion.Declaracion('$sp', 0, 0, 0, "",
                                                   "GLOBAL")
            declaracion1.ejecutar(ts_global, ast, ventana, True)
            declaracion2.ejecutar(ts_global, ast, ventana, True)

            bandera = False
            if (instrucciones != None):
                for ins in instrucciones:
                    try:
                        if (bandera == False and ins.id != "main"):
                            error = Error.Error(
                                "SEMANTICO",
                                "Error semantico, La primera etiqueta debe ser la etiqueta main:",
                                ins.linea, ins.columna)
                            ReporteErrores.func(error)
                            break
                        else:
                            bandera = True
                        if (ast.existeEtiqueta(ins)):
                            error = Error.Error(
                                "SEMANTICO",
                                "Error semantico, Ya existe la etiqueta " +
                                ins.id, ins.linea, ins.columna)
                            ReporteErrores.func(error)
                        else:
                            ast.agregarEtiqueta(ins)
                    except:
                        pass
            self.ts_global = ts_global
            self.ast = ast
            self.listado_gramatical = g.func(1, None).copy()

            self.debug(ventana)
예제 #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 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
예제 #14
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
예제 #15
0
파일: Ejecutor.py 프로젝트: harias25/MinorC
 def generarRErrores(self):
     reporteErrores = ReporteErrores.ReporteErrores()
     reporteErrores.generarReporte()
예제 #16
0
파일: Ejecutor.py 프로젝트: harias25/MinorC
    def ascendente(self, ventana):
        sys.setrecursionlimit(2147483644)
        ventana.consola.clear()
        ReporteErrores.func(None, True)
        g.textoEntrada = ventana.editor.text()
        g.func(0, None)
        instrucciones = g.parse(ventana.editor.text())
        self.instrucciones = instrucciones
        ts_global = TS.Entorno(None)
        ts_global.asignarConsola(ventana.consola)
        ast = AST.AST(instrucciones)

        declaracion1 = Declaracion.Declaracion('$ra', 0, 0, 0, "", "GLOBAL")
        declaracion2 = Declaracion.Declaracion('$sp', 0, 0, 0, "", "GLOBAL")
        declaracion1.ejecutar(ts_global, ast, ventana, False)
        declaracion2.ejecutar(ts_global, ast, ventana, False)

        #PRIMERA PASADA PARA GUARDAR TODAS LAS ETIQUETAS
        bandera = False
        if (instrucciones != None):
            for ins in instrucciones:
                try:
                    if (bandera == False and ins.id != "main"):
                        error = Error.Error(
                            "SEMANTICO",
                            "Error semantico, La primera etiqueta debe ser la etiqueta main:",
                            ins.linea, ins.columna)
                        ReporteErrores.func(error)
                        break
                    else:
                        bandera = True
                    if (ast.existeEtiqueta(ins)):
                        error = Error.Error(
                            "SEMANTICO",
                            "Error semantico, Ya existe la etiqueta " + ins.id,
                            ins.linea, ins.columna)
                        ReporteErrores.func(error)
                    else:
                        ast.agregarEtiqueta(ins)
                except:
                    pass

        main = ast.obtenerEtiqueta("main")

        if (main != None):
            salir = False
            for ins in main.instrucciones:
                try:
                    if (isinstance(ins, Asignacion.Asignacion)
                            or isinstance(ins, Conversion.Conversion)):
                        ins.setAmbito("main")

                    if (ins.ejecutar(ts_global, ast, ventana, False) == True):
                        salir = True
                        break
                except:
                    pass
            if (not salir):
                siguiente = ast.obtenerSiguienteEtiqueta("main")
                if (siguiente != None):
                    siguiente.ejecutar(ts_global, ast, ventana, False)
        else:
            error = Error.Error(
                "SEMANTICO",
                "Error semantico, No puede iniciarse el programa ya que no existe la etiqueta main:",
                0, 0)
            ReporteErrores.func(error)

        listado = ReporteErrores.func(None)
        if (len(listado) > 0):
            QMessageBox.critical(
                ventana.centralwidget, "Errores en Ejecución",
                "Se obtuvieron errores en la ejecución del Código Ingresado, verifique reporte de Errores"
            )

        self.ts_global = ts_global
        self.ast = ast
        self.listado_gramatical = g.func(1, None).copy()