def AFN_To_AFD (self): automata = AFD () #Asignar el mismo alfabeto del AFN al AFD automata.Alfabeto = self.Alfabeto #Obtenemos el tamaño del alfabeto num_columnas = (len (self.Alfabeto) + 1) #Se crea una lista de estados si vacío estados_si = [] #Calculamos la cerradura epsilon del estado inicial del AFN Si = self.Cerradura_Epsilon (self.Estado_Inicial) #Se agrega el conjunto de estados obtenido S0 estados_si.append (Estados_Si (Si)) #Agregamos la primera fila de la tabla fila = [-1] * num_columnas for c in automata.Alfabeto: fila [(list(automata.Alfabeto)).index (c)] = c fila [num_columnas - 1] = '¿Acept?' (automata.Tabla).append (fila) #Transiciones de la tabla for Si in estados_si: #Fila que se agregará a la tabla de transiciones fila = [-1] * num_columnas #Se recorre todo el alfabeto del automata for simbolo in automata.Alfabeto: #Conjunto de estados auxiliar con la operación Ir A aux = self.Ir_A (Si.Estados, simbolo) #Tokens de la tabla for estado in Si.Estados: if (estado.Estado_Aceptacion): fila [len (automata.Alfabeto)] = estado.Token break #Se verifica que el conjunto obtenido no sea vacío if (len (aux) == 0): continue else: #Verificamos si el conjunto obtenido ya existe existe = False for x in estados_si: #Si ya existe el conjunto de estados if (aux == x.Estados): existe = True fila [(list (automata.Alfabeto)).index (simbolo)] = x.id_estado break #Si el conjunto de estados no existe if (not existe): aux2 = Estados_Si (aux) estados_si.append (aux2) fila [(list (automata.Alfabeto)).index (simbolo)] = aux2.id_estado (automata.Tabla).append (fila) return automata
def Convertir_AFN(): os.system("cls") automata1 = int( input( '\n\n\nSelecciona el autómata que deseas convertir a AFD:\t')) - 1 Automata = AFD() #Se convierte al automata AFN a un AFD Automata = (Automatas[automata1]).AFN_To_AFD() print('\n\nAlfabeto: ', Automata.Alfabeto) print('\n\nTabla de transiciones:\n\n') Automata.get_tabla() num_automata = int( input('\n\n¿En qué posición deseas guardar el autómata ' + posiciones() + ' ?\t')) - 1 #Guardamos el automata creado en una de las n posiciones que se tienen Automatas[num_automata] = Automata
def analisis_lexico_2 (self): self.entrada_cadena.place_forget () self.label_cadena.place_forget () self.label_posicion.place_forget () self.combo_posicion.place_forget () self.boton_analisis_lexico_2.place_forget () cadena = self.entrada_cadena.get () posicion = self.combo_posicion.current () correcto = 'Secuencia de tokens:' Automata = AFD () Automata = (Automatas [posicion]) Lex = Lexic (Automata, cadena) token = 1 tokens = '' while (token != 0): token, lexema = Lex.get_token () tokens = tokens + 'Token: ' + str (token) + '\t\tLexema: ' + str (lexema) + '\n' color_azul = '#214E77' color_gris = '#686B6D' fuente_botones = font.Font (family = 'Microsoft YaHei UI Light', size = 12, weight = 'bold') fuente_correcto = font.Font (family = 'Microsoft YaHei UI Light', size = 22, weight = 'bold') fuente_correcto2 = font.Font (family = 'Microsoft YaHei UI Light', size = 14, weight = 'bold') self.label_correcto = Label (self.ventana, text = correcto, font = fuente_correcto, fg = color_gris, bg = 'white') self.label_correcto.place (relx = 0.12, rely = 0.04) self.label_tokens = Label (self.ventana, text = tokens, font = fuente_correcto2, fg = color_gris, bg = 'white') self.label_tokens.place (relx = 0.2, rely = 0.15) self.boton_menu_principal = Button (self.ventana, text = 'Regresar al menu principal', font = fuente_botones, cursor = 'hand2', fg = color_azul, bg = 'white', bd=0, command=self.regresar_menu_principal_5) self.boton_menu_principal.place (relx = 0.26, rely = 0.85) self.boton_otra_cadena = Button (self.ventana, text = 'Validar otra cadena', font = fuente_botones, cursor = 'hand2', fg = color_azul, bg = 'white', bd=0, command = self.otro_analisis_lexico) self.boton_otra_cadena.place (relx = 0.32, rely = 0.92)
def lectura(archivo, b): initialState = "" alpha = [] states = [] acceptStates = [] transitions = [] if path.isfile(archivo): file = open(archivo, "r") for line in file.readlines(): data = line.replace('\n', "") if b == "a": array1 = data.split(";") array2 = array1[0].split(",") array3 = array1[1].split(",") if initialState == "": initialState = array2[0] if array2[2] not in alpha: alpha.append(array2[2]) if array2[0] not in states: states.append(array2[0]) if array2[1] not in states: states.append(array2[1]) if array3[0] == "true": if array2[0] not in acceptStates: acceptStates.append(array2[0]) if array3[1] == "true ": if array2[1] not in acceptStates: acceptStates.append(array2[1]) t = Transition(array2[0], array2[1], array2[2]) transitions.append(t) afd = AFD(archivo, alpha, states, initialState, acceptStates, transitions) print(afd.toString()) if len(afd.mistakes) == 0: AFDS.append(afd) else: print(afd.mistakes) if b == "g": array1 = data.split(">") file.close() else: print("El archivo no existe.")
def newAFD(nombre): nombre = nombre.strip() if datosDuplicados(nombre) == False: nuevoAFD = AFD(nombre, [], [], "", [], {}, [], [], []) listaAFD.append(nuevoAFD) return True else: alerta("Datos Duplicados") return False
def prueba(): op = 0 while op != 7: print("*************************************************") print("*\t 1. Crear AFD \t\t\t\t*") print("*\t 2. Crear Gramatica \t\t*") print("*\t 3. Evaluar Cadenas \t\t*") print("*\t 4. Reportes \t\t\t\t*") print("*\t 5. Cargar Archivo de Entrada \t*") print("*\t 6. Gramatica Tipo2 y AP\t*") print("*\t 7. Salir \t\t\t\t*") print("*************************************************") op = str(input("Elige una opcion:\n")) if op == '1': os.system("cls") AFD.pedirnombre() break elif op == '2': os.system("cls") gramatica.pedirnombre() break elif op == '3': os.system("cls") gramatica.valinombre() break elif op == '4': os.system("cls") reporte.menu() break elif op == '5': os.system("cls") Archivo.menuarchivo() break elif op == '6': os.system("cls") tip.pedirnombre() break elif op == '7': sys.exit() break
def scanner(keywords, token, kt, chars): print("scanning") key.append(keywords) try: if len(kt) != 0: try: for i in range(len(kt)): print("entro") infn, ress = AFD(kt[i]) outK.append([ress, infn]) print("paso") except: pass except: pass if len(token) != 0: for i in range(len(token)): infn, ress = AFD(token[i]) out.append([ress, infn]) textoA = "C:/Users/lcest/Desktop/Proyecto2Final/ari.txt" print("paso") doc = reads(textoA) eval(doc)
def __init__(self, speed, name): self.name = name; self.speed = speed; self.direction = ""; self.sprite = "images/" + name + "_r1.png"; self.set_surface(); self.rect = self.surface.get_rect(); self.upAnim = ["images/" + name + "_u1.png", "images/" + name + "_u2.png"]; self.downAnim = ["images/" + name + "_d1.png", "images/" + name + "_d2.png"]; self.leftAnim = ["images/" + name + "_l1.png", "images/" + name + "_l2.png"]; self.rightAnim = ["images/" + name + "_r1.png", "images/" + name + "_r2.png"]; self.animFrame = 0; self.blocked = ""; # Automato que define o movimento do objeto: self.automato = AFD(); self.currentState = None;
def convertir_AFN_2 (self): self.label_posicion.place_forget () self.combo_posicion.place_forget () self.boton_convertir_AFN_2.place_forget () posicion = self.combo_posicion.current () correcto = 'AFN convertido correctamente' Automata = AFD () Automata = (Automatas [posicion]).AFN_To_AFD () Automatas [posicion] = Automata color_azul = '#214E77' color_gris = '#686B6D' fuente_botones = font.Font (family = 'Microsoft YaHei UI Light', size = 12, weight = 'bold') fuente_correcto = font.Font (family = 'Microsoft YaHei UI Light', size = 22, weight = 'bold') posicion_y = 120 posicion_x = 60 self.label_correcto = Label (self.ventana, text = correcto, font = fuente_correcto, fg = color_gris, bg = 'white') self.label_correcto.place (x = posicion_x - 30, y = posicion_y) self.boton_menu_principal = Button (self.ventana, text = 'Regresar al menu principal', font = fuente_botones, cursor = 'hand2', fg = color_azul, bg = 'white', bd=0, command=self.regresar_menu_principal_4) self.boton_menu_principal.place (relx = 0.25, rely = 0.35) self.boton_convertir_otro_AFN = Button (self.ventana, text = 'Convertir otro autómata', font = fuente_botones, cursor = 'hand2', fg = color_azul, bg = 'white', bd=0, command = self.convertir_otro_AFN) self.boton_convertir_otro_AFN.place (relx = 0.28, rely = 0.45)
def menuAFD(): states = [] alphabet = [] initialState = "" acceptStates = [] transitions = [] os.system('cls') z = True y = input("Ingrese el nombre del AFD a crear: ") print(y) while z: print("") print("1. Ingresar estados") print("2. Ingresar alfabeto") print("3. Estado Inicial") print("4. Estados de aceptación") print("5. Ingresar transiciones") print("6. Ayuda") print("7. Generar AFD y gramatica") print("8. Regresar") print("9. Imprimir todos los AFDS") x = input("Ingrese la opción que desea escoger: ") if x == "1": os.system('cls') states.clear() i = True while i: state = input( "Ingrese el estado nuevo, ***para dejar de ingresar estados presiones la tecla '/' seguida de enter*** " ) if state == "/": os.system('cls') print(states) i = False else: states.append(state) elif x == "2": os.system('cls') alphabet.clear() i = True while i: symbol = input( "Ingrese el símbolo nuevo, **para dejar de ingresar símbolos presiones la tecla '/' seguida de enter** " ) if symbol == "/": os.system('cls') print(alphabet) i = False else: alphabet.append(symbol) elif x == "3": print("") i = input("Ingrese el estado inicial: ") initialState = i print(i) elif x == "4": os.system('cls') i = True acceptStates.clear() while i: accept = input( "Ingrese los estados de aceptacion uno por uno, ***para dejar de ingresar estados de aceptación presiones la tecla '/' seguida de enter***: " ) if accept == "/": os.system('cls') print(acceptStates) i = False else: acceptStates.append(accept) elif x == "5": transitions.clear() print("1. Modo 1") print("2. Modo 2") i = input("Ingrese el modo para ingresar sus transiciones: ") if i == "1": os.system('cls') i = True while i: transition = input( "Ingrese las trasiciones *para dejar de ingresar transiciones presiones la tecla '/' seguida de enter* " ) if transition == "/": os.system('cls') i = False else: arrayOne = [] arrayOne = transition.split(";") arrayTwo = [] arrayTwo = arrayOne[0].split(",") arrayTwo.append(arrayOne[1]) if arrayTwo[2] == "epsilon": print( "Error no pueden haber transiciones con epsilon en un AFD solo en un AFN" ) else: transition = Transition(arrayTwo[0], arrayTwo[1], arrayTwo[2]) transitions.append(transition) for t in transitions: print(t.toString()) elif i == "2": terminals = input("Ingrese los terminales del AFD: ") terminals = terminals.replace("[", "") terminals = terminals.replace("]", "") NT = input("Ingrese los no terminales del AFD: ") NT = NT.replace("[", "") NT = NT.replace("]", "") SD = input("Ingrse los simbolos destino del AFD") SD = SD.replace("[", "") SD = SD.replace("]", "") print(terminals, " ", NT, " ", SD) terminales = terminals.split(",") non_terminals = NT.split(",") i = True while i: i = input( "Presione '/' seguido de enter para regresar al menu anterior y completar el AFD" ) if i == "/": i = False else: print( "*************La opción que elegiste no existe**************" ) elif x == "6": os.system('cls') print("") print("**********DATOS DEL CURSO********") print("") print("Curso: Lenguajes Formales de Programación") print("Sección: B+") print("Auxiliar: Jose Veliz") print("Digito: 4") elif x == "7": afd = AFD(y, alphabet, states, initialState, acceptStates, transitions) if len(afd.mistakes) > 0: for m in afd.mistakes: print(m) else: print(afd.toString()) AFDS.append(afd) elif x == "8": z = False elif x == "9": for afd in AFDS: print(afd.toString()) else: print("") print("********La opcion que elegiste no existe************")
# SI LA CADENA ESTA BIEN SIGUE SINO SE ACABA EL PROGRAMA if (contar(r)): pass else: print("Expresion no valida") print("Adios") sys.exit() # ALTERACIONES AL REGEX rAFD = r r = arreglar1(r) r = arreglar2(r) # INICIALIZACION DE CLASES clase = thompson.Automata() claseAFD = AFD.AutomataFD() # LECTURA DE REGEX BASADO EN El ARTIMETIC EXPRESSION EVALUATION DE GEEKS FOR GEEKS values = [] ops = [] i = 0 nodos = [] while i < len(r): if r[i] == '(': ops.append(r[i]) elif r[i].isalpha() or r[i].isdigit(): values.append(r[i]) elif r[i] == ')': while len(ops) != 0 and ops[-1] != '(': op = ops.pop() if op != '*':
def __init__(self, AFN): self.lista = list() self.AFN = AFN self.AFD = AFD() self.etiqueta = 'A'
class Transformacion: def __init__(self, AFN): self.lista = list() self.AFN = AFN self.AFD = AFD() self.etiqueta = 'A' def convertir_automata(self): self.AFD.alfabeto = self.AFN.alfabeto self.AFD.alfabeto.remove('E') estado = self.cerradura_epsilon(self.AFN.estado_inicial) actual = Subconjunto(estado, self.etiqueta) self.lista.append(actual) pendientes = list() pendientes.append(actual) agregar = True self.etiqueta = chr(ord(self.etiqueta) + 1) nuevo = None while len(pendientes) > 0: actual = pendientes.pop() for simbolo in self.AFD.alfabeto: estados = self.cerradura_epsilon( self.mover(actual.estados, simbolo)) agregar = True for i in self.lista: if i.estados == estados: agregar = False nuevo = i break if agregar: nuevo = Subconjunto(estados, self.etiqueta) pendientes.append(nuevo) self.lista.append(nuevo) self.etiqueta = chr(ord(self.etiqueta) + 1) self.AFD.agregar_transicion(actual.etiqueta, nuevo.etiqueta, simbolo) # Obtenemos los estados finales e inicial for elemento in self.lista: if self.AFN.estado_inicial in elemento.estados: self.AFD.estado_inicial = elemento.etiqueta for final in self.AFN.estados_finales: if final in elemento.estados: self.AFD.estados_finales.add(elemento.etiqueta) # Operacion cerradura_epsilon def cerradura_epsilon(self, pila_estados): estados_epsilon = set() aux = list() if type(pila_estados) is set: aux.extend(pila_estados) else: aux.append(pila_estados) for estado_actual in aux: for t in self.AFN.transiciones: if t.caracter == 'e' and t.actual == estado_actual and ( t.siguiente not in aux): aux.append(t.siguiente) estados_epsilon.update(aux) return estados_epsilon # Operacion Mover def mover(self, estados, simbolo): estados_aux = set() for estado in estados: for transicion in self.AFN.transiciones: if simbolo != 'e' and estado == transicion.actual and transicion.caracter == simbolo: estados_aux.add(transicion.siguiente) return estados_aux
class Main: print() print("Escriba el nombre del archivo de texto, finalizando sin la extensión .txt:") entrada = input() arch = LecturaArchivo(entrada+".txt") lectura = arch.LeerArchivo() if lectura[0][0] == '#!dfa': autoAFD = AFD(lectura) print() print("Menu AFD:") print("1. Procesar Cadena") print("2. Procesar Cadena con Detalle") print("3. Graficar Automata") print("4. Hallar Complemento") print("Ingrese el numero de la opción deseada del menu:") opcion = input() if opcion == "1": print("Ingrese la cadena que desea procesar:") cad = input() if (autoAFD.procesarCadena(cad, "proceCad")) == True: print("|La cadena ES aceptada por el automata|") else: print("|La cadena NO ES aceptada por el automata|") elif opcion == "2": print("Ingrese la cadena que desea procesar:") cad = input() print(autoAFD.procesarCadenaConDetalles(cad)) elif opcion == "3": autoAFD.graficarAutomata() elif opcion == "4": autoAFD.hallarComplemento() elif opcion == "5": autoAFD.minimizarAutomata() else: print("¡No ingresó una opcion válida!") elif lectura[0][0] == '#!nfa': autoAFN = AFN(lectura) print() print("Menu AFN:") print("1. Procesar Cadena") print("2. Graficar Automata") print("3. Convertir AFN a AFD") print("Ingrese el numero de la opción deseada del menu:") opcion = input() if opcion == "1": print("Ingrese la cadena que desea procesar:") cad = input() if (autoAFN.procesarCadena(cad,"procesarCadena")) == True: print("|La cadena ES aceptada por el automata|") else: print("|La cadena NO ES aceptada por el automata|") elif opcion == "2": autoAFN.graficarAutomata() elif opcion == "3": autoAFN.imprimirConversionArchivoTexto() archi = LecturaArchivo("ConversionAFNtoAFD.txt") lect = archi.LeerArchivo() autoAFN.graficarConversionToAFD(lect) else: print("¡No ingresó una opcion válida!")
def __init__(self, afnd): self.afnd = afnd self.afd = AFD.Automato() self.afd.set_alfabeto(self.afnd.alfabeto) self.conversao()
# todos los estados deben ser accesibles # automata completo con estados limbo # documentacion # para lambda usar simbolo $ #archivo de especificacion de formato revisar # import AFD # import string # prueba import AFD import ProcesamientoCadenaAFD a = AFD.AFD("fileAFD.txt") # b = ProcesamientoCadenaAFD.ProcesamientoCadenaAFD()
def main(): os.system('cls') print('Ingrese nombre del AFD: ', end='') nombreAFD = input() automata = AFD.AFD() if listaAFD.get(nombreAFD) == None and nombreAFD != '': listaAFD[nombreAFD] = automata while True: os.system('cls') print('1. Ingresar estados') print('2. Ingresar alfabeto') print('3. Ingresar estado inicial') print('4. Ingresar estados de aceptación') print('5. Ingrese transicion') print('6. Ayuda') print('7. Salir') print() entrada = input() if entrada == '1': os.system('cls') print('Ingrese estado: ', end='') estado = input() if estado not in Le: if automata.agregarEstado(estado): print('Se agrego con exito el estado') else: print('Error al ingresar estado') else: print('Error al ingresar estado') elif entrada == '2': os.system('cls') print('Ingrese alfabeto: ', end='') alfabeto = input() if alfabeto not in Le: if automata.agregarAlfabeto(alfabeto): print('Se agrego con exito el alfabeto') else: print('Error al ingresar alfabeto') else: print('Error al ingresar alfabeto') elif entrada == '3': os.system('cls') print('Ingrese estado inicial: ', end='') estado_inicial = input() if automata.agregarEstadoInicial(estado_inicial): print('Se agrego correctamente el estado inicial') else: print('Error al agregar estado inicial') elif entrada == '4': os.system('cls') print('Ingrese estado de aceptación: ', end='') estado_aceptacion = input() if automata.agregarEstadosAceptacionn(estado_aceptacion): print('Se agrego correctamente el estado de aceptacion') else: print('Error al ingreso estado de aceptacion') elif entrada == '5': os.system('cls') print('1. Modo 1\n2. Modo 2') modo = input() if modo == '1': os.system('cls') print('Ingrese cadena: ', end='') cadena = input() if automata.modo1(cadena): print('Se agrego correctamente la transición') else: print('Cadena invalida') elif modo == '2': os.system('cls') print('Ingrese cadena para la columna: ', end='') colunma = input() print('Ingrese cadena para la fila: ', end='') fila = input() print('Ingrese cadena para el destino: ', end='') destino = input() if automata.modo2(colunma, fila, destino): print('Se agrego correcta la transicion') else: print('Error cadena invalida') elif entrada == '6': os.system('cls') print('Lenguajes Fomrales') print('Sección: B+') print('Carné: 201800586\n') print(automata.toString()) print('Modo 1: ', ' '.join(automata.getTransicionModo1())) print('Modo 2: ', ' '.join(automata.getTransicionModo2())) elif entrada == '7': break input() else: print('Error nombre de AFD') input()
simbolo) for key,val in self.Destados.items(): if self.afn.inicial in val[:-1]: self.afd.establecer_inicial(key) for item in self.afn.finales: if item in val[:-1]: self.afd.establecer_final(key) def checar_marcados(self): marcados = True for key, val in self.Destados.items(): if val[-1] == False: marcados = False return marcados def obtener_afd(self): return self.afd if __name__ == "__main__": autn = AFN.AFN() autn.cargar_desde("afn.afn") autn.cargar_transiciones() autn.obtener_inicial() autn.obtener_finales() autn.obtener_alfabeto() subconjuntos = Subconjuntos(autn) subconjuntos.construir_subconjuntos() autd = AFD.AFD() autd = subconjuntos.obtener_afd() autd.guardar_en("afd")
# Primeiro Trabalho de LFA # Arthur Alexsander Martins Teodoro - 0022427 # Saulo Ricardo Dias Fernandes - 0021581 # Data: 05/05/2017 from AFD import * automata1 = AFD() automata1.load("minimizacaoProva.jff") print "Estados equivalentes:" print automata1.equivalentsStates() automata1Min = automata1.minimum() automata1Min.save("automatoProvaMinimizado.jff") if AFD.equivalents(automata1, automata1Min): print "Os automatos sao equivalentes" else: print "Os automatos nao sao equivalentes" #quantidade par de a's automata2 = AFD() automata2.addState(0, True, True) automata2.addState(1) automata2.addTransition(0, 1, "a") automata2.addTransition(1, 0, "a") automata2.addTransition(0, 0, "b") automata2.addTransition(1, 1, "b") #quantidade impar de b's automata3 = AFD() automata3.addState(0, initial=True)
def __init__(self, afn): self.Destados = {} self.afn = afn self.afd = AFD.AFD()
def StartAFD(E, Q, F, Q0, QF): C = entry.get() AFD.adf_start(E, Q, F, Q0, QF, C) AFDresultsGUI.GUIstart(C)
def AFDf(): AFD.main()