static CharacterClassIterator characterClassIteratorFromMiniRegexp_v1(S regexp, int i default 0) { int l = l(regexp); if (i >= l) ret new CCI_End; char c = regexp.charAt(i); // backslash (escaped character) if (c == '\\' && i+1 < l) ret CCI_SingleChar(regexp.charAt(i+1), characterClassIteratorFromMiniRegexp_v1(regexp, i+2)); // optional character if (i+1 < l && regexp.charAt(i+1) == '?') { CharacterClassIterator rest = characterClassIteratorFromMiniRegexp_v1(regexp, i+2); // TODO: coalesce choice objects when rest is already a choice? new HashMap map; // TODO: optional comparator fOr (char cc : rest.acceptedChars()) map.put(cc, rest); // may override an assignment made above map.put(c, new CCI_SingleChar(c, rest)); ret CCI_Choice(rest.canEndHere(), map); } // normal character ret CCI_SingleChar(regexp.charAt(i), characterClassIteratorFromMiniRegexp_v1(regexp, i+1)); }