private static List<Segment> compileSegments(String patternString) { assert patternString != null; Cursor cursor = new Cursor(patternString.toCharArray()); List<Segment> segments = new ArrayList<>(); cursor.skipWhile(CHAR_SEPARATOR); while (cursor.get(0) != CHAR_EOF) { Segment segment = consumeSegment(cursor); segments.add(segment); } return segments; }
String consumeVariable() { assert get(0) == CHAR_DOLLER; int start = cursor; skip(); if (get(0) != CHAR_OPEN_BRACE) { cursor = start; throw new IllegalArgumentException(MessageFormat.format( "Invalid variable format (cursor=\"{0}\", offset={1})", this, cursor)); } skip(); int nameStart = cursor; skipWhile(CHAR_ALPHABET); if (get(0) != CHAR_CLOSE_BRACE) { cursor = start; throw new IllegalArgumentException(MessageFormat.format( "Invalid variable format (cursor=\"{0}\", offset={1})", this, cursor)); } String name = String.valueOf(cbuf, nameStart, cursor - nameStart); skip(); return name; }
break LOOP; case CHAR_SEPARATOR: cursor.skipWhile(CHAR_SEPARATOR); break LOOP; case CHAR_ASTERISK:
skipWhile(CHAR_ALPHABET); if (get(0) == CHAR_SEPARATOR) { skip();
private static Segment consumeSegment(Cursor cursor) { assert cursor != null; int first = cursor.get(0); assert first != CHAR_SEPARATOR && first != CHAR_EOF : cursor; // special case if (first == CHAR_ASTERISK && cursor.get(1) == CHAR_ASTERISK && (cursor.get(2) == CHAR_SEPARATOR || cursor.get(2) == CHAR_EOF)) { cursor.skipWhile(CHAR_ASTERISK); cursor.skipWhile(CHAR_SEPARATOR); return Segment.TRAVERSE; } List<PatternElement> elements = consumeElements(cursor); return new Segment(elements); }