code: private void parseRuleLine(StringTokenizer st) {
          TZDBRule rule = new TZDBRule();
          String name = st.nextToken();
          if (rules.containsKey(name) == false) {
              rules.put(name, new ArrayList<TZDBRule>());
          }
          rules.get(name).add(rule);
          rule.startYear = parseYear(st.nextToken(), 0);
          rule.endYear = parseYear(st.nextToken(), rule.startYear);
          if (rule.startYear > rule.endYear) {
              throw new IllegalArgumentException("Year order invalid: " + rule.startYear + " > " + rule.endYear);
          }
          parseOptional(st.nextToken());  // type is unused
          parseMonthDayTime(st, rule);
          rule.savingsAmount = parsePeriod(st.nextToken());
          rule.text = parseOptional(st.nextToken());
      }
docs: Parses a Rule line.
  
  @param st  the tokenizer, not null