code: public final void setToken(AnalyzedTokenReadings[] tokens, int index, int next) {
      int idx = index;
      if (index >= tokens.length) {
        // TODO: hacky workaround, find a proper solution. See EnglishPatternRuleTest.testBug()
        idx = tokens.length - 1;
      }
      setToken(tokens[idx]);
      IncludeRange includeSkipped = match.getIncludeSkipped();
      if (next > 1 && includeSkipped != IncludeRange.NONE) {
        StringBuilder sb = new StringBuilder();
        if (includeSkipped == IncludeRange.FOLLOWING) {
          formattedToken = null;
        }
        for (int k = index + 1; k < index + next; k++) {
          if (tokens[k].isWhitespaceBefore()
              && !(k == index + 1 && includeSkipped == IncludeRange.FOLLOWING)) {
            sb.append(' ');
          }
          sb.append(tokens[k].getToken());
        }
        skippedTokens = sb.toString();
      } else {
        skippedTokens = "";
      }
    }
docs: Sets the token to be formatted etc. and includes the support for
  including the skipped tokens.
  
  @param tokens Array of tokens
  @param index Index of the token to be formatted
  @param next Position of the next token (the skipped tokens are the ones between the tokens[index] and tokens[next]