| 123 | // (When f1 can match an empty string, f1* must be implemented as (f1+)? |
| 124 | // to get the priority match order correct.) |
| 125 | private Frag loop(Frag f1, boolean nongreedy) { |
| 126 | Frag f = newInst(Inst.ALT); |
| 127 | Inst i = prog.getInst(f.i); |
| 128 | if (nongreedy) { |
| 129 | i.arg = f1.i; |
| 130 | f.out = f.i << 1; |
| 131 | } else { |
| 132 | i.out = f1.i; |
| 133 | f.out = f.i << 1 | 1; |
| 134 | } |
| 135 | prog.patch(f1.out, f.i); |
| 136 | return f; |
| 137 | } |
| 138 | |
| 139 | // Given a fragment for a, returns a fragment for a? or a?? (if nongreedy) |
| 140 | private Frag quest(Frag f1, boolean nongreedy) { |