src/main/java/com/basistech/tclre/Nfa.java
void pullback() throws RegexException {
        State s;
        State nexts;
        Arc a;
        Arc nexta;
        boolean progress;

    /* find and pull until there are no more */
        do {
            progress = false;
            for (s = states; s != null; s = nexts) {
                nexts = s.next;
                for (a = s.outs; a != null; a = nexta) {
                    nexta = a.outchain;
                    if (a.type == '^' || a.type == Compiler.BEHIND) {
                        if (pull(a)) {
                            progress = true;
                        }
                    }
                    assert nexta == null || s.no != State.FREESTATE;
                }
            }
            if (progress) {
                dumpnfa();
            }
        } while (progress);

        for (a = pre.outs; a != null; a = nexta) {
            nexta = a.outchain;
            if (a.type == '^') {
                assert a.co == 0 || a.co == 1;
                newarc(Compiler.PLAIN, bos[a.co], a.from, a.to);
                freearc(a);
            }
        }
    }
void pullback() throws RegexException {
        State s;
        State nexts;
        Arc a;
        Arc nexta;
        boolean progress;

    /* find and pull until there are no more */
        do {
            progress = false;
            for (s = states; s != null; s = nexts) {
                nexts = s.next;
                for (a = s.outs; a != null; a = nexta) {
                    nexta = a.outchain;
                    if (a.type == '^' || a.type == Compiler.BEHIND) {
                        if (pull(a)) {
                            progress = true;
                        }
                    }
                    assert nexta == null || s.no != State.FREESTATE;
                }
            }
            if (progress) {
                dumpnfa();
            }
        } while (progress);

        for (a = pre.outs; a != null; a = nexta) {
            nexta = a.outchain;
            if (a.type == '^') {
                assert a.co == 0 || a.co == 1;
                newarc(Compiler.PLAIN, bos[a.co], a.from, a.to);
                freearc(a);
            }
        }
    }
pullback - pull back constraints backward to (with luck) eliminate them