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 {
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 {
static Tree parse(String spec) throws IllegalArgumentException { Reader r = new Reader(spec); Tree t = new Tree(); list(r, t); r.expect(Token.EOF); return t; } private static void list(Reader r, Tree t) throws IllegalArgumentException {
static Tree parse(String spec) throws IllegalArgumentException { Reader r = new Reader(spec); Tree t = new Tree(); list(r, t); r.expect(Token.EOF); return t; } private static void list(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}
static Tree parse(String spec) throws IllegalArgumentException { Reader r = new Reader(spec); Tree t = new Tree(); list(r, t); r.expect(Token.EOF); return t; } private static void list(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); } 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) {