src/main/java/com/basistech/tclre/Subre.java
String dumpst(boolean nfapresent) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("%s. `%c'", shortId(), op));

        if (0 != (flags & LONGER)) {
            sb.append(" longest");
        }
        if (0 != (flags & SHORTER)) {
            sb.append(" shortest");
        }
        if (0 != (flags & MIXED)) {
            sb.append(" hasmixed");
        }
        if (0 != (flags & CAP)) {
            sb.append(" hascapture");
        }
        if (0 != (flags & BACKR)) {
            sb.append(" hasbackref");
        }
        if (0 == (flags & INUSE)) {
            sb.append(" UNUSED");
        }
        if (subno != 0) {
            sb.append(String.format(" (#%d)", subno));
        }
        if (min != 1 || max != 1) {
            sb.append(String.format(" {%d,", min));
            if (max != Compiler.INFINITY) {
                sb.append(String.format("%d", max));
            }
            sb.append("}");
        }
        if (nfapresent) {
            sb.append(String.format(" %d-%d", begin.no, end.no));
        }
        if (left != null) {
            sb.append(String.format(" L:%s", left.toString()));
        }
        if (right != null) {
            sb.append(String.format(" R:%s", right.toString()));
        }

        sb.append("\n");
        if (left != null) {
            left.dumpst(nfapresent);
        }
        if (right != null) {
            right.dumpst(nfapresent);
        }

        return sb.toString();
    }
String dumpst(boolean nfapresent) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("%s. `%c'", shortId(), op));

        if (0 != (flags & LONGER)) {
            sb.append(" longest");
        }
        if (0 != (flags & SHORTER)) {
            sb.append(" shortest");
        }
        if (0 != (flags & MIXED)) {
            sb.append(" hasmixed");
        }
        if (0 != (flags & CAP)) {
            sb.append(" hascapture");
        }
        if (0 != (flags & BACKR)) {
            sb.append(" hasbackref");
        }
        if (0 == (flags & INUSE)) {
            sb.append(" UNUSED");
        }
        if (subno != 0) {
            sb.append(String.format(" (#%d)", subno));
        }
        if (min != 1 || max != 1) {
            sb.append(String.format(" {%d,", min));
            if (max != Compiler.INFINITY) {
                sb.append(String.format("%d", max));
            }
            sb.append("}");
        }
        if (nfapresent) {
            sb.append(String.format(" %d-%d", begin.no, end.no));
        }
        if (left != null) {
            sb.append(String.format(" L:%s", left.toString()));
        }
        if (right != null) {
            sb.append(String.format(" R:%s", right.toString()));
        }

        sb.append("\n");
        if (left != null) {
            left.dumpst(nfapresent);
        }
        if (right != null) {
            right.dumpst(nfapresent);
        }

        return sb.toString();
    }
dumpst - dump a subRE tree