String consumeToken() { StringBuilder buf = new StringBuilder(); while (true) { // TODO escape sequence int kind = get(0); if (kind != CHAR_ALPHABET) { break; } buf.append(cbuf[cursor]); skip(); } return buf.toString(); }
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; }
public List<String> consumeSelection() { assert get(0) == CHAR_OPEN_BRACE; int start = cursor; skip(); 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(); while (true) { skipWhile(CHAR_ALPHABET); if (get(0) == CHAR_SEPARATOR) { skip(); } else {
ArrayList<PatternElement> results = new ArrayList<>(); LOOP: while (true) { int c = cursor.get(0); switch (c) { case CHAR_EOF: break LOOP; case CHAR_ASTERISK: if (cursor.get(1) == CHAR_ASTERISK) { throw new IllegalArgumentException(MessageFormat.format( "Invalid consecutive wildcard \"**\" (cursor=\"{0}\", offset={1})",
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); }
void skipWhile(int kind) { while (true) { int result = get(0); if (result == CHAR_EOF || result != kind) { break; } skip(); } }