docs: private String nextString() {
      assert input.charAt(idx - 1) == '"' : "Char is '" + input.charAt(idx - 1) + '\'';
      StringBuilder sb = new StringBuilder();
      while (true) {
        char c = nextChar();
        switch (c) {
          case '\n':
          case '\r':
            throw new IllegalArgumentException("Unterminated string");
          case '\\':
            c = nextChar();
            switch (c) {
              case 'b':
                sb.append('\b');
                break;
              case 't':
                sb.append('\t');
                break;
              case 'n':
                sb.append('\n');
                break;
              case 'f':
                sb.append('\f');
                break;
              case 'r':
                sb.append('\r');
                break;
              case 'u':
                sb.append((char) Integer.parseInt(input.substring(idx, idx + 4), 16));
                idx += 4;
                break;
              case '"':
              case '\'':
              case '\\':
              case '/':
                sb.append(c);
                break;
              default:
                throw new IllegalArgumentException("Illegal escape");
            }
            break;
          default:
            if (c == '"') {
              return sb.toString();
            }
            sb.append(c);
        }
      }
    }