def move(t_nodes, a): """ :param t_nodes: T :param a: a :return: move(T, a) """ return unions([node.next.get(a, set()) for node in t_nodes])
def convert_dfa(self, copy_meta=None): """ :return: 与本nfa等价的dfa """ if copy_meta is None: copy_meta = [] nfa, dfa = self, DFA() vis = dict() cur_set = closure(nfa.start) dfa.start = DFANode(nfa_set=cur_set) vis[frozenset(cur_set)] = dfa.start que = Queue() que.put(cur_set) while not que.empty(): tmp = que.get() dfa_node = vis[frozenset(tmp)] next_set = unions([set(node.next.keys()) for node in tmp]).difference({"ep"}) for a in next_set: u = closure(move(tmp, a)) if frozenset(u) not in vis: que.put(u) dfa_node.next[a] = DFANode(nfa_set=u) next_node = dfa_node.next[a] intersection = nfa.end & u if intersection: for key in copy_meta: next_node.meta.setdefault(key, []) next_node.meta[key].extend([node.meta.get(key) for node in intersection]) next_node.end = True dfa.end.add(next_node) vis[frozenset(u)] = dfa_node.next[a] else: dfa_node.next[a] = vis[frozenset(u)] return dfa
def nexts(self): return unions([self.next[key] for key in self.next.keys()])