private static void node(Reader r, Tree t) throws IllegalArgumentException { Object actual = r.peek(); if (actual instanceof Token) { throw new IllegalArgumentException("expected name at " + r.pos); } r.advance(); Tree subtree = new Tree(); t.children.put((String) actual, subtree); if (r.accept(Token.LBRACE)) { list(r, subtree); r.expect(Token.RBRACE); } if (r.accept(Token.QLBRACE)) { subtree.range = parseRange(r); r.expect(Token.QRBRACE); } } static Range parseRange(Reader r) {
private static void node(Reader r, Tree t) throws IllegalArgumentException { Object actual = r.peek(); if (actual instanceof Token) { throw new IllegalArgumentException("expected name at " + r.pos); } r.advance(); Tree subtree = new Tree(); t.children.put((String) actual, subtree); if (r.accept(Token.LBRACE)) { list(r, subtree); r.expect(Token.RBRACE); } if (r.accept(Token.QLBRACE)) { subtree.range = parseRange(r); r.expect(Token.QRBRACE); } } static Range parseRange(Reader r) {
static Range parseRange(Reader r) { int min; if (r.accept(Token.COMMA)) { return new Range(0, r.expectNumber()); // {,M} } else { min = r.expectNumber(); if (r.peek()==Token.QRBRACE) return new Range(min,min+1); // {N} r.expect(Token.COMMA); if (r.peek()==Token.QRBRACE) return new Range(min,Integer.MAX_VALUE); // {N,} else return new Range(min,r.expectNumber()); // {N,M} } }
static Range parseRange(Reader r) { int min; if (r.accept(Token.COMMA)) { return new Range(0, r.expectNumber()); // {,M} } else { min = r.expectNumber(); if (r.peek()==Token.QRBRACE) return new Range(min,min+1); // {N} r.expect(Token.COMMA); if (r.peek()==Token.QRBRACE) return new Range(min,Integer.MAX_VALUE); // {N,} else return new Range(min,r.expectNumber()); // {N,M} } }
private static void list(Reader r, Tree t) throws IllegalArgumentException { node(r, t); if (r.accept(Token.COMMA)) { list(r, t); } } private static void node(Reader r, Tree t) throws IllegalArgumentException {
private static void node(Reader r, Tree t) throws IllegalArgumentException { Object actual = r.peek(); if (actual instanceof Token) { throw new IllegalArgumentException("expected name at " + r.pos); } r.advance(); Tree subtree = new Tree(); t.children.put((String) actual, subtree); if (r.accept(Token.LBRACE)) { list(r, subtree); r.expect(Token.RBRACE); } } private enum Token {COMMA, LBRACE, RBRACE, EOF}
private static void list(Reader r, Tree t) throws IllegalArgumentException { node(r, t); if (r.accept(Token.COMMA)) { list(r, t); } } private static void node(Reader r, Tree t) throws IllegalArgumentException {
private static void list(Reader r, Tree t) throws IllegalArgumentException { node(r, t); if (r.accept(Token.COMMA)) { list(r, t); } } private static void node(Reader r, Tree t) throws IllegalArgumentException {