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)
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()
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)
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
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
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()
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()