def kleene(nfa1): initial_state, final_state = new_states(nfa1) nfa = NFA(CHARSET, {initial_state, final_state}, initial_state, {final_state}, {}) for state in nfa1.states: nfa.states.add(state) new_delta = {} for (state, symbol), next_states in nfa1.delta.items(): new_delta.update({(state, symbol): next_states}) for stop_state in nfa1.final_states: if (stop_state, "") in nfa1.delta: new_next_states = nfa1.delta[(stop_state, "")] new_next_states.add(final_state) new_delta.update({(stop_state, ""): new_next_states}) else: new_delta.update({(stop_state, ""): {final_state}}) new_delta.update({(initial_state, ""): {nfa1.start_state, final_state}}) new_delta.update({(final_state, ""): {initial_state}}) nfa.delta = new_delta return nfa
def alternate(nfa1, nfa2): rename_states(nfa2, nfa1) initial_state, final_state = new_states(nfa1, nfa2) nfa = NFA(CHARSET, {initial_state, final_state}, initial_state, {final_state}, {}) for state in nfa1.states: nfa.states.add(state) for state in nfa2.states: nfa.states.add(state) new_delta = {} new_delta.update({(initial_state, ""): {nfa1.start_state, nfa2.start_state}}) for stop_state in nfa1.final_states: if (stop_state, "") in nfa1.delta: new_next_states = nfa1.delta[(stop_state, "")] new_next_states.add(final_state) new_delta.update({(stop_state, ""): new_next_states}) else: new_delta.update({(stop_state, ""): {final_state}}) for stop_state in nfa2.final_states: if (stop_state, "") in nfa2.delta: new_next_states = nfa2.delta[(stop_state, "")] new_next_states.add(final_state) new_delta.update({(stop_state, ""): new_next_states}) else: new_delta.update({(stop_state, ""): {final_state}}) for (state, symbol), next_states in nfa1.delta.items(): if state in nfa1.final_states and symbol == "": pass new_delta.update({(state, symbol): next_states}) for (state, symbol), next_states in nfa2.delta.items(): if state in nfa1.final_states and symbol == "": pass new_delta.update({(state, symbol): next_states}) nfa.delta = new_delta return nfa