docs: private void parseAttributeStatements(BufferedReader br, ArrayList<String> names, ArrayList<String> types) throws IOException {
      String line;
      // Load attribute metadata
      while(true) {
        line = br.readLine();
        if(line == null) {
          throw new AbortException(ARFF_HEADER_DATA + " not found in file.");
        }
        // Skip comments and empty lines
        if(ARFF_COMMENT.reset(line).matches() || EMPTY.reset(line).matches()) {
          continue;
        }
        // Break on data statement to continue
        if(ARFF_HEADER_DATA.reset(line).matches()) {
          break;
        }
        // Expect an attribute specification
        Matcher matcher = ARFF_HEADER_ATTRIBUTE.reset(line);
        if(matcher.matches()) {
          String name = matcher.group(1);
          if(name.charAt(0) == '\'' && name.charAt(name.length() - 1) == '\'') {
            name = name.substring(1, name.length() - 1);
          }
          else if(name.charAt(0) == '"' && name.charAt(name.length() - 1) == '"') {
            name = name.substring(1, name.length() - 1);
          }
          String type = matcher.group(2);
          names.add(name);
          types.add(type);
          // logger.warning("Attribute name: " + name + " type: " + type);
          continue;
        }
        throw new AbortException("Unrecognized line: " + line);
      }
      assert (names.size() == types.size());
    }