src/main/java/com/basistech/tclre/Runtime.java
private boolean condissect(RuntimeSubexpression t, int begin, int end) {
        Dfa d;
        Dfa d2;
        int mid;
        assert t.op == '.';
        assert t.left != null && t.left.machine.states.length > 0;
        assert t.right != null && t.right.machine.states.length > 0;

        boolean shorter = (t.left.flags & Subre.SHORTER) != 0;
        int stop = shorter ? end : begin;


        d = new Dfa(this, t.left.machine);
        d2 = new Dfa(this, t.right.machine);

    /* pick a tentative midpoint */
        if (shorter) {
            mid = d.shortest(begin, begin, end, null, null);
        } else {
            mid = d.longest(begin, end, null);
        }
        if (mid == -1) {
            throw new RuntimeException("Impossible mid.");
        }

    /* iterate until satisfaction or failure */
        while (d2.longest(mid, end, null) != end) {
        /* that midpoint didn't work, find a new one */
            if (mid == stop) {
            /* all possibilities exhausted! */
                throw new RuntimeException("no midpoint");
            }
            if (shorter) {
                mid = d.shortest(begin, mid + 1, end, null, null);
            } else {
                mid = d.longest(begin, mid - 1, null);
            }
            if (mid == -1) {
                throw new RuntimeException("Failed midpoint");
            }
        }

    /* satisfaction */
        boolean dissectMatch = dissect(t.left, begin, mid);
        if (!dissectMatch) {
            return false;
        }
        return dissect(t.right, mid, end);
    }
private boolean condissect(RuntimeSubexpression t, int begin, int end) {
        Dfa d;
        Dfa d2;
        int mid;
        assert t.op == '.';
        assert t.left != null && t.left.machine.states.length > 0;
        assert t.right != null && t.right.machine.states.length > 0;

        boolean shorter = (t.left.flags & Subre.SHORTER) != 0;
        int stop = shorter ? end : begin;


        d = new Dfa(this, t.left.machine);
        d2 = new Dfa(this, t.right.machine);

    /* pick a tentative midpoint */
        if (shorter) {
            mid = d.shortest(begin, begin, end, null, null);
        } else {
            mid = d.longest(begin, end, null);
        }
        if (mid == -1) {
            throw new RuntimeException("Impossible mid.");
        }

    /* iterate until satisfaction or failure */
        while (d2.longest(mid, end, null) != end) {
        /* that midpoint didn't work, find a new one */
            if (mid == stop) {
            /* all possibilities exhausted! */
                throw new RuntimeException("no midpoint");
            }
            if (shorter) {
                mid = d.shortest(begin, mid + 1, end, null, null);
            } else {
                mid = d.longest(begin, mid - 1, null);
            }
            if (mid == -1) {
                throw new RuntimeException("Failed midpoint");
            }
        }

    /* satisfaction */
        boolean dissectMatch = dissect(t.left, begin, mid);
        if (!dissectMatch) {
            return false;
        }
        return dissect(t.right, mid, end);
    }
private boolean condissect ( RuntimeSubexpression t , int begin , int end ) { Dfa d ; Dfa d2 ; int mid ; assert t . op == ' ' ; assert t . left != null && t . left . machine . states . length > 0 ; assert t . right != null && t . right . machine . states . length > 0 ; boolean shorter = ( t . left . flags & Subre . SHORTER ) != 0 ; int stop = shorter ? end : begin ; d = new Dfa ( this , t . left . machine ) ; d2 = new Dfa ( this , t . right . machine ) ; /* pick a tentative midpoint */ if ( shorter ) { mid = d . shortest ( begin , begin , end , null , null ) ; } else { mid = d . longest ( begin , end , null ) ; } if ( mid == - 1 ) { throw new RuntimeException ( "Impossible mid." ) ; } /* iterate until satisfaction or failure */ while ( d2 . longest ( mid , end , null ) != end ) { /* that midpoint didn't work, find a new one */ if ( mid == stop ) { /* all possibilities exhausted! */ throw new RuntimeException ( "no midpoint" ) ; } if ( shorter ) { mid = d . shortest ( begin , mid + 1 , end , null , null ) ; } else { mid = d . longest ( begin , mid - 1 , null ) ; } if ( mid == - 1 ) { throw new RuntimeException ( "Failed midpoint" ) ; } } /* satisfaction */ boolean dissectMatch = dissect ( t . left , begin , mid ) ; if ( ! dissectMatch ) { return false ; } return dissect ( t . right , mid , end ) ; }
condissect - determine concatenation subexpression matches (uncomplicated)
condissect - determine concatenation subexpression matches ( uncomplicated )