Exemplo n.º 1
0
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
Exemplo n.º 2
0
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