def re2a(er, trace=False): S = Automaton() name = {} q0 = er.shift(True, None) name[q0] = 0 nq0 = name[q0] if trace: sys.stderr.write("Initial state: %d\nItems:\n%s\n" % (nq0, q0)) S.addState(nq0, q0) S.makeInitial(nq0) if q0.isFinal(): S.makeFinal(nq0, q0.category()) pending = set([q0]) while len(pending) != 0: q = pending.pop() nq = name[q] for charClass in q.movements(): d = q.shift(False, charClass) if not name.has_key(d): pending.add(d) name[d] = len(name) nd = name[d] S.addState(nd, d) if trace: sys.stderr.write( "Added state: %d%s, from %d with class %s\nItems:\n%s\n" % (nd, d.isFinal() and " (final)" or "", nq, charClass, d)) if d.isFinal(): S.makeFinal(nd, d.category()) nd = name[d] S.addTransition(nq, charClass, nd) S.compactArcs() return S