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; }
ArrayList<PatternElement> results = new ArrayList<>(); LOOP: while (true) { int c = cursor.get(0); switch (c) { case CHAR_EOF: break LOOP; case CHAR_SEPARATOR: cursor.skipWhile(CHAR_SEPARATOR); break LOOP; case CHAR_ASTERISK: if (cursor.get(1) == CHAR_ASTERISK) { throw new IllegalArgumentException(MessageFormat.format( "Invalid consecutive wildcard \"**\" (cursor=\"{0}\", offset={1})", cursor, cursor.getOffset())); cursor.skip(); results.add(SingletonPatternElement.WILDCARD); break; case CHAR_OPEN_BRACE: results.add(new Selection(cursor.consumeSelection())); break; case CHAR_DOLLER: results.add(new Variable(cursor.consumeVariable())); break; case CHAR_ALPHABET: results.add(new Token(cursor.consumeToken())); break; default:
public List<String> consumeSelection() { assert get(0) == CHAR_OPEN_BRACE; int start = cursor; skip(); List<String> contents = new ArrayList<>(); boolean head = true; while (true) { int first = get(0); if (first == CHAR_EOF) { cursor = start; } else if (head || first == CHAR_BAR) { if (head == false) { assert get(0) == CHAR_BAR; skip(); skipWhile(CHAR_ALPHABET); if (get(0) == CHAR_SEPARATOR) { skip(); } else { break; skip(); break; } else {
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; }
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); }