def carregaGramatica(nomeArq): gramatica = Gramatica() escreve_terminais = 0 escreve_variaveis = 0 escreve_regras = 0 escreve_inicial = 0 with open(nomeArq) as arq: for dado in arq: matchT = re.match(r'#Terminais',dado, re.I|re.M) if matchT: escreve_terminais = 1 escreve_regras = 0 escreve_variaveis = 0 escreve_inicial = 0 matchV = re.match(r'#Variaveis',dado, re.I|re.M) if matchV: escreve_terminais = 0 escreve_regras = 0 escreve_variaveis = 1 escreve_inicial = 0 matchR = re.match(r'#Regras', dado, re.I|re.M) if matchR: escreve_terminais =0 escreve_regras=1 escreve_variaveis=0 escreve_inicial = 0 matchI = re.match(r'#Inicial', dado, re.I|re.M) if matchI: escreve_terminais =0 escreve_regras=0 escreve_variaveis=0 escreve_inicial = 1 if escreve_terminais : matchObj = re.match(r'\[ (\w) \]', dado, re.I|re.M) if matchObj: gramatica.adicionaTerminais(matchObj.group(1).strip()) if escreve_variaveis : matchObj = re.match(r'\[ (\w) \]', dado, re.I | re.M) if matchObj: gramatica.adicionaVariavel(matchObj.group(1).strip()) if escreve_regras : matchObj = re.findall(r'\[ (\w) \]', dado, re.I | re.M) if matchObj: gramatica.adicionaRegra(matchObj[0], "".join(matchObj[1:]).strip()) if escreve_inicial : matchObj = re.match(r'\[ (\w) \]', dado, re.I | re.M) if matchObj: gramatica.defineInicial(matchObj.group(1).strip()) #print(dado) return gramatica
def analizar(self): analisisValido = self._G() if analisisValido: # Se verifica que todos los caracteres de la cadena hayan sido analizados if self._lexico.getToken() != 0: analisisValido = False self._gramatica = Gramatica() return analisisValido
def Traducir_Alto_nivel(self): global traducir try: self.consola.clear() #self.tabla_cuadruplos.clear() tab = self.editor.widget(self.editor.currentIndex()) items = tab.children() codigo = items[0].text() ast = Gramatica.parse(codigo) lst_errores = Gramatica.lst_errores errores = GraficarError(args=(lst_errores, "Errores"), daemon=True) errores.start() gda = GramaticaGDA.parse(codigo) nodo = GramaticaM.parse(codigo) g_ast = GraficarArbol(args=(nodo, "AST"), daemon=True) g_ast.start() g_gda = GraficarGDA(args=(gda, "GDA"), daemon=True) g_gda.start() self.codigo_3d.clear() self.codigo_3d_optimizado.clear() traducir = Traducir( args=(ast, self.tabla_cuadruplos, self.codigo_3d, self.consola, self.tabla_simbolos, self.codigo_3d_optimizado), daemon=True) traducir.start() except: print("ERROR EN EJECUCION NORMAL")
def verificar_extension_gramatica(ruta): nombre, extension = os.path.split(ruta) extension = extension.split(".") global nueva_gramatica if extension[1] == "grm": nueva_gramatica = Gramatica.Gramatica(extension[0]) return True else: return False
def newGramatica(name): name = name.strip() if duplicateData(name) == False: newGrammar = Gramatica(name, [], [], "", {}, [], [], [], [], []) listaGramatica.append(newGrammar) return True else: alerta("Datos Duplicados") return False
def EjecutarASC(input): instrucciones = g.parse(input) global ts_global ts_global = TS.TablaDeSimbolos() if instrucciones is None: print('Unnable to Compile. Please Check the Code') else: grafo = Graficadora() grafo.Recorrer_Instrucciones_Inicio(instrucciones) Recorrer_Instrucciones(instrucciones, ts_global)
def Ejecucion(self): Gram.Ejecucion() if len(Lista) > 0: self.consola.insert('insert', Lista[0]) else: return if len(Lista) > 0: self.consola.insert('insert', Lista[0]) else: return
def DebuggerIniciar(input): global Terminar Terminar = False global instrdebug instrdebug = g.parse(input) global ts_global Globales.debug = 0 ts_global = TS.TablaDeSimbolos() if instrdebug is None: print('Unnable to Compile. Please Check the Code') else: accion_LlenarTsEtiquetas( instrdebug, ts_global) # tengo que llenar al iniciar mis etiquetas
def cargarGram(self): f = filedialog.askopenfilename(defaultextension='.txt', initialdir=DEFAULTDIR) if not len(f): return self.G = Gramatica.Gramatica(f, self.gramType.get()) if self.G.errorAlCrear != False: messagebox.showinfo( "Error al crear la gramatica", "La gramatica no se puedo crear porque" + self.G.errorAlCrear) self.G = None return self.btnAnalizar.config(state='normal') self.lblinfoGram.config(text=str(self.G))
def convertir_afd_gramatica(): nueva_gramatica = Gramatica.Gramatica(automata.nombre) nueva_gramatica.agregar_terminales("epsilon") for aux in automata.alfabeto: nueva_gramatica.agregar_terminales(aux) for aux1 in automata.estados: nueva_gramatica.agregar_no_terminales(aux1.nombre) nueva_gramatica.determinar_no_terminal_inicial(automata.estado_inicial) for aux2 in automata.estado_aceptacion: for aux3 in nueva_gramatica.listaNoTerminales: if aux2 == aux3.no_terminal: nueva_gramatica.definir_produccion(aux3.no_terminal, "epsilon") for aux4 in automata.estados: for aux5 in nueva_gramatica.listaNoTerminales: if aux4.nombre == aux5.no_terminal: for aux6 in aux4.lista_transiciones: produccion = aux6.simbolo + " " + aux6.estadoDestino aux5.agregar_produccion(produccion) return nueva_gramatica
def analizar(): input = content_text.get(1.0,"end-1c") #print(input) print(".........Analizando....") Gramatica.AnalizarInput(input)
def reporte_AST_(self): Gram.reporte_AST_GLOB()
def Traducir_Codigo_(self): Gram.traducir_AST_GLOB() self.enviarC3d()
def reporte_AST_(self): try: Gram.reporte_AST_GLOB() except: print("error en el reporte gramatical :(")
def reporte_gramatical_(self): try: Gram.reporte_gramatical() except: print("error en el reporte gramatical :(")
class AnalizadorSintacticoReglas(): def __init__(self, lexico): self._lexico = lexico self._ladoIzquierdoActual = '' self._gramatica = Gramatica() def analizar(self): analisisValido = self._G() if analisisValido: # Se verifica que todos los caracteres de la cadena hayan sido analizados if self._lexico.getToken() != 0: analisisValido = False self._gramatica = Gramatica() return analisisValido def getGramaticaGenerada(self): return self._gramatica def _G(self): if self._listaReglas(): return True return False def _listaReglas(self): if self._regla(): if self._listaReglas(): pass return True return False def _regla(self): if self._ladoIzquierdo(): token = self._lexico.getToken() if token == TokenReglas.FLECHA: if self._listaLadosDerecho(): token = self._lexico.getToken() if token == TokenReglas.PUNTO_COMA: self._ladoIzquierdoActual = '' return True return False def _ladoIzquierdo(self): token = self._lexico.getToken() if token == TokenReglas.SIMBOLO: self._ladoIzquierdoActual = self._lexico.getUltimoLexemaValido() self._gramatica.crearNuevaRegla(self._ladoIzquierdoActual) return True return False def _listaLadosDerecho(self): if self._ladoDerecho(): token = self._lexico.getToken() if token == TokenReglas.UNION: if self._listaLadosDerecho(): return True return False else: self._lexico.rewind() return True return False def _ladoDerecho(self): if self._listaSimbolo(): return True return False def _listaSimbolo(self): token = self._lexico.getToken() if token == TokenReglas.SIMBOLO: self._gramatica.agregarLadoDerecho( self._ladoIzquierdoActual, [self._lexico.getUltimoLexemaValido()]) if self._listaSimbolo(): return True else: self._lexico.rewind() return True return False
def Ejecucion(self): Gram.Ejecucion()
def Analisar(input): instrucciones = g.parse(input) print(instrucciones) ts_global = TS.TablaDeSimbolos() procesar_instrucciones(instrucciones, ts_global)
def Mostrar(matriz,noTerminales): i = 0 for fila in matriz: print(noTerminales[i], end=" ") i = i + 1 for valor in fila: print("\t", valor, end=" ") print() # Ejemplos de gramaticas producciones = "A->aAb,A->Bbc,B->cb" #producciones = "S->E,S->sAP,P->pASQ,Q->SS,Q->qPs,P->q,A->a" #producciones = " S->QP,P->+QP|-QP|E,Q->TA,A->*TA|/TA|E,T->(S)|a|b" gramatica = Gr.Gramatica(producciones) noTerminales = gramatica.getNoTerminal() print("No terminales: ") print(noTerminales) primeros = [] siguientes = [] print("Producciones: ") for i in gramatica.getProducciones(): print(i) print("Conjunto primeros: ") for i in range(len(noTerminales)): primeros.append(Pr.Primero(gramatica,noTerminales[i])) print(noTerminales[i] + " = {" + str(primeros[i].getConjuntosPrimeros()) + "}") print("Conjunto siguientes: ")
def ejecutar_analisis(self): #self.consola.setText("****** Preparando Analisis ******") self.consola.clear() indextab = self.editores.tabText(self.editores.currentIndex()) ##self.consola.setText("Archivo a analizar: "+indextab) tab = self.editores.widget(self.editores.currentIndex()) items = tab.children() codigo = items[0].toPlainText() ast = None analisis_semantico = False lst = [] print( "___________INICIA PROCESO DE ANALISIS LEXICO Y SINTACTICO_______________" ) try: if self.analizador_cambiado: gramaticaD.lst_errores = [] ast = gramaticaD.parse(codigo) arbolparser = GramaticaDG.parse(codigo) graficaAST = GraficarArbol(args=(arbolparser, "ASPDescendente"), daemon=True) graficaAST.start() graficaGramatical = GraficarGramatica( args=(gramaticaD.lstGrmaticales, "ReporteGramatical"), daemon=True) graficaGramatical.start() lst = gramaticaD.lst_errores gramaticaD.lstGrmaticales = [] else: gramatica.lst_errores = [] ast2 = gramatica.parse(codigo) ast = ast2.instruccion graficaAST = GraficarArbol(args=(ast2.nodo, "ASPAscendente"), daemon=True) graficaAST.start() graficaGramatical = GraficarGramatica( args=(gramatica.lstGrmaticales, "ReporteGramatical"), daemon=True) graficaGramatical.start() gramatica.lstGrmaticales = [] lst = gramatica.lst_errores except: self.consola.append( "/\\/\\/\\/\\/\\ERROR DE LEXICO, SINTACTICO/\\/\\/\\/\\") self.consola.append("REVISAR REPORTE DE ERRORES") finally: if not self.analizador_cambiado: gramatica.graficarErrores() else: gramaticaD.graficarErrores() ts = TablaSimbolos() global in_console if self.debug_mode: in_console = Debuger(args=(ast if (ast != None) else ast, ts, lst, "", items[0], self.consola, self.GTS), daemon=True) else: in_console = Ejecutor(args=(ast if (ast != None) else ast, ts, lst, "", items[0], self.consola, self.GTS), daemon=True) if ast != None: try: print( "___________INICIA PROCESO DE ANALISIS SEMANTICO_______________" ) recolector = Recolectar(ast, ts, lst) print("******FIN CONSTRUCTOR**********") recolector.procesar() recolector.getErrores() print("******FIN RECOLECCION*******") print("********** FIN DE CONSTRUCTOR ********") in_console.start() except: self.consola.append( "/\\/\\/\\/\\/\\ERROR DE EJECUCION/\\/\\/\\/\\") self.consola.append("REVISAR REPORTE DE ERRORES") ts.graficarSimbolos()
def __init__(self, lexico): self._lexico = lexico self._ladoIzquierdoActual = '' self._gramatica = Gramatica()
def enviarTexto(): input=cuadroTxt.get(1.0,"end-1c") #print(input) print(".........Analizando....") Gramatica.AnalizarInput(input)
def menu_principal(): os.system("cls") global nombreGramatica nombreGramatica = input("Ingrese el nombre de la Gramatica: ") if verificar_gramatica_existente(nombreGramatica): global gramatica gramatica = obtener_gramatica_existente(nombreGramatica) else: gramatica = Gramatica.Gramatica(nombreGramatica) listaGramaticas.append(gramatica) os.system("cls") opcion = 0 while opcion != 6: os.system("cls") print("----------Menu de Gramaticas----------") print("1) INGRESAR NO TERMINALES") print("2) INGRESAR TERMINALES") print("3) DEFINIR NO TERMINAL INICIAL") print("4) DEFINIR PRODUCCIONES") print("5) AYUDA") print("6) SALIR") try: opcion = int(input("Seleccione una opcion: ")) except ValueError as e: print() if opcion == 1: seleccion = 0 while seleccion != 2: os.system("cls") print("----------Ingresar No Terminales----------") print("1) INGRESAR NUEVO NO TERMINAL") print("2) SALIR") try: seleccion = int(input("Seleccione una opcion: ")) except: print() if seleccion == 1: no_terminal = input("Ingrese el no terminal: ") agregar_no_terminales(no_terminal) elif seleccion == 2: break else: input("Opcion incorrecta, presione enter...") elif opcion == 2: seleccion = 0 while seleccion != 2: os.system("cls") print("----------Ingresar Terminales----------") print("1) INGRESAR NUEVO TERMINAL") print("2) SALIR") try: seleccion = int(input("Seleccione una opcion: ")) except: print() if seleccion == 1: terminal = input("Ingrese el terminal: ") agregar_terminales(terminal) elif seleccion == 2: break else: input("Opcion incorrecta, presione enter...") elif opcion == 3: os.system("cls") print("----------Definir No Terminal Inicial----------") no_terminal = input("Ingrese el no terminal desea como inicial: ") definir_no_terminal_inicial(no_terminal) elif opcion == 4: seleccion = 0 while seleccion != 2: os.system("cls") print("----------Definir Producciones----------") print("1) INGRESAR NUEVA PRODUCCION") print("2) SALIR") try: seleccion = int(input("Seleccione una opcion: ")) except: print() if seleccion == 1: cadena = input("Ingrese la produccion: ") definir_producciones(cadena) elif seleccion == 2: break else: input("Opcion incorrecta, presione enter...") elif opcion == 5: os.system("cls") print("Lenguajes Formales y de Programacion Seccion A") print("Auxiliar: Elmer Real") print("4") input("Presione enter") elif opcion == 6: break else: input("Opcion incorrecta, presione enter")