Machine = Automata() for node in graph.get_nodes(): node_name = node.get_name() if node_name != 'node': if node_name == 'S1': final = True else: final = False state = State(node_name, final=final) if node_name == 'S0': Machine.set_initial_state(state) else: Machine.add_state(state) for edge in graph.get_edges(): from_state = Machine.states[edge.get_source()] to_state = Machine.states[edge.get_destination()] label = edge.to_string() print(label) label = label.split('=') label = label[1] label = label[:-2] label = label.replace('"', '') Machine.add_transition(from_state, to_state, label) Machine.print_source()
def Thompson(tokens, countStates): for token in tokens: if (token == "*"): countStates += 1 A1 = tokens[tokens.index(token) - 1] A1.set_final([countStates]) A1.add_state(countStates - 1) A1.add_state(countStates) A1.set_symbols(joinList(A1.symbols, ["3"])) A1.sub_trans_states(1) A1.add_transitions( [A1.initial_state[0], A1.initial_state[0] + 1, "3"]) A1.add_transitions( [A1.final_states[0] - 1, A1.final_states[0], "3"]) A1.add_transitions([A1.initial_state[0], A1.final_states[0], "3"]) A1.add_transitions( [A1.final_states[0] - 1, A1.initial_state[0] + 1, "3"]) tokens.pop(tokens.index(token) - 1) tokens[tokens.index(token)] = A1 countStates += 1 #print(A1.initial_state, A1.final_states, A1.states, A1.symbols, A1.transitions) return tokens, countStates elif (token == "."): A1 = tokens[tokens.index(token) - 2] A2 = tokens[tokens.index(token) - 1] # Cambios en los estados del segundo autómata if (A1.final_states != A2.initial_state): A2.set_inicial(A1.final_states) A2.sub_finaState(-1) A2.sub_states(-1) A2.sub_trans_states(-1) countStates -= 1 #print(A1.initial_state, A1.final_states, A1.states, A1.symbols, A1.transitions) #print(A2.initial_state, A2.final_states, A2.states, A2.symbols, A2.transitions) #Creación del nuevo autómata Aut = Automata() Aut.set_inicial(A1.initial_state) Aut.set_final(A2.final_states) Aut.set_states(joinList(A1.states, A2.states)) Aut.set_symbols(joinList(A1.symbols, A2.symbols)) Aut.set_transitions(joinList(A1.transitions, A2.transitions)) #print(Aut.initial_state, Aut.final_states, Aut.states, Aut.symbols, Aut.transitions) tokens.pop(tokens.index(token) - 1) tokens.pop(tokens.index(token) - 1) tokens[tokens.index(token)] = Aut return tokens, countStates elif (token == "|"): countStates += 1 A1 = tokens[tokens.index(token) - 2] A2 = tokens[tokens.index(token) - 1] Aut = Automata() Aut.set_inicial(A1.initial_state) Aut.set_final([countStates]) Aut.set_states(joinList(A1.states, A2.states)) Aut.add_state(countStates - 1) Aut.add_state(countStates) Aut.set_symbols(joinList(A1.symbols, A2.symbols)) Aut.set_symbols(joinList(Aut.symbols, ["3"])) A1.sub_trans_states(1) A2.sub_trans_states(1) Aut.set_transitions(joinList(A1.transitions, A2.transitions)) Aut.add_transitions( [Aut.initial_state[0], A1.initial_state[0] + 1, "3"]) Aut.add_transitions( [Aut.initial_state[0], A2.initial_state[0] + 1, "3"]) Aut.add_transitions( [A1.final_states[0] + 1, Aut.final_states[0], "3"]) Aut.add_transitions( [A2.final_states[0] + 1, Aut.final_states[0], "3"]) #Actualizar array tokens.pop(tokens.index(token) - 1) tokens.pop(tokens.index(token) - 1) tokens[tokens.index(token)] = Aut countStates += 1 #print("Creacion", Aut.initial_state, Aut.final_states, Aut.states, Aut.symbols, Aut.transitions) return tokens, countStates elif (isinstance(token, str)): Aut = Automata() Aut.add_symbol(token) Aut.set_inicial([countStates]) countStates += 1 Aut.set_final([countStates]) countStates += 1 Aut.set_states([Aut.initial_state[0], Aut.final_states[0]]) Aut.add_transitions( [Aut.initial_state[0], Aut.final_states[0], token]) tokens[tokens.index(token)] = Aut #print("Creacion", Aut.initial_state, Aut.final_states, Aut.states, Aut.symbols, Aut.transitions) return tokens, countStates
# Lê a expressão regular do usuário e constrói o autômato referênte à ela regEx = input('Digite a expressão regular: ') Machine = Automata() # Variável auxiliar para contar o número de grafos impressos graph_counter = 0 # ----- PASSO I: Inicialização do autômato ----- # Inicializa os estados S0 e S1 (sendo S1 um estado final) S0 = State('S0') S1 = State('S1', final=True) # Adiciona os estados à e-NFA Machine.set_initial_state(S0) Machine.add_state(S1) # Adiciona a transição S0 -> S1 à e-NFA utilizando a regEx de entrada Machine.add_transition(S0, S1, regEx) # Imprime o resultado do passo I filename = 'grafos/Q1_grafo_passo_' + str(graph_counter) + '.dot' Machine.print_graph(filename, view=False) #imagename = filename + '.png' #display(Image(filename=#imagename)) # Incrementa o contador de grafos graph_counter = graph_counter + 1 # Enquanto o autômato não estiver pronto (somente arcos de um símbolo), contrói o autômato automata_ready = False
#Entrada 1 teste_1 = Automata() # Inicializa os estados S0 e S1 (sendo S1 um estado final) S0 = State('0') S1 = State('1', final=True) S2 = State('2') S3 = State('3') S4 = State('4') S5 = State('5') S6 = State('6') # Adiciona os estados à e-NFA teste_1.set_initial_state(S0) teste_1.add_state(S1) teste_1.add_state(S2) teste_1.add_state(S3) teste_1.add_state(S4) teste_1.add_state(S5) teste_1.add_state(S6) # Adiciona as transições da e-NFA teste_1.add_transition(S0, S3, '&') teste_1.add_transition(S3, S3, 'a,b') teste_1.add_transition(S3, S2, '&') teste_1.add_transition(S2, S4, 'b') teste_1.add_transition(S4, S5, 'b') teste_1.add_transition(S5, S6, '&') teste_1.add_transition(S6, S6, 'b,a') teste_1.add_transition(S6, S1, '&')