/** Reads a reserved tags and names list like "reserved 10, 12 to 14, 'foo';". */ private ReservedElement readReserved(Location location, String documentation) { ImmutableList.Builder<Object> valuesBuilder = ImmutableList.builder(); while (true) { char c = peekChar(); if (c == '"' || c == '\'') { valuesBuilder.add(readQuotedString()); } else { int tagStart = readInt(); c = peekChar(); if (c != ',' && c != ';') { if (!readWord().equals("to")) { throw unexpected("expected ',', ';', or 'to'"); } int tagEnd = readInt(); valuesBuilder.add(Range.closed(tagStart, tagEnd)); } else { valuesBuilder.add(tagStart); } } c = readChar(); if (c == ';') break; if (c != ',') throw unexpected("expected ',' or ';'"); } ImmutableList<Object> values = valuesBuilder.build(); if (values.isEmpty()) { throw unexpected("'reserved' must have at least one field name or tag"); } return ReservedElement.create(location, documentation, values); }
/** Reads extensions like "extensions 101;" or "extensions 101 to max;". */ private ExtensionsElement readExtensions(Location location, String documentation) { int start = readInt(); // Range start. int end = start; if (peekChar() != ';') { if (!"to".equals(readWord())) throw unexpected("expected ';' or 'to'"); String s = readWord(); // Range end. if (s.equals("max")) { end = Util.MAX_TAG_VALUE; } else { end = Integer.parseInt(s); } } if (readChar() != ';') throw unexpected("expected ';'"); return ExtensionsElement.create(location, start, end, documentation); }
String name = readName(); if (readChar() != '=') throw unexpected("expected '='"); int tag = readInt();
private GroupElement readGroup(String documentation, Field.Label label) { String name = readWord(); if (readChar() != '=') { throw unexpected("expected '='"); } int tag = readInt(); GroupElement.Builder builder = GroupElement.builder() .label(label) .name(name) .tag(tag) .documentation(documentation); ImmutableList.Builder<FieldElement> fields = ImmutableList.builder(); if (readChar() != '{') throw unexpected("expected '{'"); while (true) { String nestedDocumentation = readDocumentation(); if (peekChar() == '}') { pos++; break; } Location location = location(); String fieldLabel = readWord(); Object field = readField(nestedDocumentation, location, fieldLabel); if (!(field instanceof FieldElement)) { throw unexpected("expected field declaration, was " + field); } fields.add((FieldElement) field); } return builder.fields(fields.build()) .build(); }