Пример #1
0
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])
Пример #2
0
 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
Пример #3
0
 def nexts(self):
     return unions([self.next[key] for key in self.next.keys()])