Exemplo n.º 1
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)
Exemplo n.º 2
0
    def debugger(self):
        self.tableWidget.setRowCount(0)
        self.tableWidget.setRowCount(100)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("No."))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Simbolo"))
        self.tableWidget.setItem(0, 2, QTableWidgetItem("Valor"))

        if (self.hilo_terminado):
            sys.setrecursionlimit(2147483644)
            self.consola.clear()
            ReporteErrores.func(None, True)
            g.func(0, None)
            texto = analizar(self.editor.text())
            self.gramatica = getGrammar()
            self.simbolos = getSimbols()
            g.textoEntrada = texto
            instrucciones = g.parse(texto)
            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, self, True)
            declaracion2.ejecutar(ts_global, ast, self, 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()
Exemplo n.º 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)
Exemplo n.º 4
0
    def debug(self):
        self.hilo_terminado = False
        main = self.ast.obtenerEtiqueta("main")

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

                    contador = 1
                    self.tableWidget.setRowCount(0)
                    self.tableWidget.setRowCount(100)
                    self.tableWidget.setItem(0, 0, QTableWidgetItem("No."))
                    self.tableWidget.setItem(0, 1, QTableWidgetItem("Simbolo"))
                    self.tableWidget.setItem(0, 2, QTableWidgetItem("Valor"))
                    for key in self.ts_global.tabla:
                        s = self.ts_global.tabla[key]
                        self.tableWidget.setItem(
                            contador, 0, QTableWidgetItem(str(contador)))
                        self.tableWidget.setItem(contador, 1,
                                                 QTableWidgetItem(s.id))
                        self.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, self, 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(
                self.centralwidget, "Errores en Ejecución",
                "Se obtuvieron errores en la ejecución del Código Ingresado, verifique reporte de Errores"
            )
        self.hilo_terminado = True
Exemplo n.º 5
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
Exemplo n.º 6
0
    def ascendente(self):
        sys.setrecursionlimit(2147483644)
        self.consola.clear()
        global codigoAug  
        ReporteErrores.func(None,True)
        g.textoEntrada = codigoAug
        g.func(0,None)
        instrucciones = g.parse(codigoAug)
        self.instrucciones = instrucciones
        ts_global = TS.Entorno(None)
        ts_global.asignarConsola(self.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,self,False)
        declaracion2.ejecutar(ts_global,ast,self,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,self,False) == True):
                        salir = True
                        break
                except:
                    pass
            if(not salir):   
                siguiente = ast.obtenerSiguienteEtiqueta("main")
                if(siguiente!=None):
                    siguiente.ejecutar(ts_global,ast,self,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(self.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()
Exemplo n.º 7
0
    def traduccion(self):
        if self.codigo.text() == "":
            return 

        self.editor.setText("")
        sys.setrecursionlimit(2147483644)
        self.consola.clear()
        ReporteErrores.func(None,True)
        g.textoEntrada = self.codigo.text()
        g.func(0,None)
        instrucciones = g.parse(self.codigo.text())
        self.instrucciones = instrucciones
        ts_global = TS.Entorno(None)
        ast = AST.AST(instrucciones) 
        temp.temporal(True)
        temp.parametro(True)
        temp.etiqueta(True)
        temp.listaContinue(-1,None)
        temp.listaBreak(-1,None)
        temp.listaReturn(-1,None)
        temp.listaLLamada(-1,None)
        temp.listaRecusion(-1,None)

        #PRIMERA PASADA PARA GUARDAR TODAS LAS FUNCIONES Y STRUCTS
        if(instrucciones != None):
            for ins in instrucciones:
                try:
                    if(isinstance(ins,Funcion)): 
                        if(ast.existeEtiqueta(ins)):
                            error = Error.Error("SEMANTICO","Error semantico, Ya existe la funcion "+ins.id,ins.linea,ins.columna)
                            ReporteErrores.func(error)
                        else:
                            if(ins.id != "main"):
                                ins.inicializar(ts_global,ast,self)
                            ast.agregarEtiqueta(ins)
                    elif(isinstance(ins,Struct)):
                        if(ast.existeStruct(ins)):
                            error = Error.Error("SEMANTICO","Error semantico, Ya existe el Struct "+ins.id,ins.linea,ins.columna)
                            ReporteErrores.func(error)
                        else:
                            ast.agregarStruct(ins)
                except:
                        pass

        #SE TRADUCE EL METODO MAIN
        main = ast.obtenerEtiqueta("main")

        if(main != None):
            self.editor.append("main:")

            #se corren las instrucciones globales
            for ins in instrucciones:
                try:
                    if(not isinstance(ins,Funcion)): 
                        try:
                            ins.traducir(ts_global,ast,self)
                        except:
                            pass
                except:
                        pass
            entMain = TS.Entorno(ts_global)             
            for ins in main.instrucciones:
                try:
                    ins.traducir(entMain,ast,self)
                except:
                    pass
                
            ast.entornoGlobal.tabla = {**entMain.tabla,**ast.entornoGlobal.tabla}
            ast.entornoGlobal.tabla = {**ts_global.tabla,**ast.entornoGlobal.tabla}
        else:
            error = Error.Error("SEMANTICO","Error semantico, No puede iniciarse el programa ya que no existe el metodo main()",0,0)
            ReporteErrores.func(error)
            
        listado = ReporteErrores.func(None)
        if(len(listado)>0):
            QMessageBox.critical(self.centralwidget, "Errores en Traducción", "Se obtuvieron errores en la traducción del Código Ingresado, verifique reporte de Errores de Traducción")

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