Exemple #1
0
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