def __init__(self, epsilon_nfa: EpsilonNFA):
     edges = []
     dfa = epsilon_nfa.to_deterministic()
     state_to_idx = dict([(state, index)
                          for index, state in enumerate(dfa.states)])
     for state_from, transitions in epsilon_nfa.to_deterministic().to_dict(
     ).items():
         for label, state_to in transitions.items():
             edges.append(
                 Edge(node_from=state_to_idx[state_from],
                      node_to=state_to_idx[state_to],
                      label=label))
     self.dfa = dfa
     self.dfa_state_to_idx = state_to_idx
     start_states = [
         self.dfa_state_to_idx[state] for state in self.dfa.start_states
     ]
     final_states = [
         self.dfa_state_to_idx[state] for state in self.dfa.final_states
     ]
     super().__init__(edges, set(start_states), set(final_states))
Beispiel #2
0
def graph_to_dfa(g: Graph):
    nfa = EpsilonNFA()
    state_count = 0
    for tup in g:
        sub, pred, obj = map(str, tup)
        # nfa.add_transition(State(sub), Symbol(pred), State(obj))
        nfa.add_start_state(State(sub))
        nfa.add_start_state(State(obj))
        nfa.add_final_state(State(sub))
        nfa.add_final_state(State(obj))

        nfa.add_transition(State(sub), Epsilon(), State(state_count))
        for c in pred:
            nfa.add_transition(State(state_count),
                               Symbol(c),
                               State(state_count+1))
            state_count += 1
        nfa.add_transition(State(state_count),
                           Epsilon(),
                           State(obj))
    return nfa.to_deterministic()