code: private String[] concatMatches(int start, int index,
        int tokenIndex, AnalyzedTokenReadings[] tokens,
        int nextTokenPos, List<Match> suggestionMatches)
            throws IOException {
      String[] finalMatch;
      int len = phraseLen(index);
      Language language = rule.language;
      if (len == 1) {
        int skippedTokens = nextTokenPos - tokenIndex;
        MatchState matchState = suggestionMatches.get(start).createState(language.getSynthesizer(), tokens, tokenIndex - 1, skippedTokens);
        finalMatch = matchState.toFinalString(language);
        if (suggestionMatches.get(start).checksSpelling()
            && finalMatch.length == 1
            && "".equals(finalMatch[0])) {
          finalMatch = new String[1];
          finalMatch[0] = MISTAKE;
        }
      } else {
        List<String[]> matchList = new ArrayList<>();
        for (int i = 0; i < len; i++) {
          int skippedTokens = nextTokenPos - (tokenIndex + i);
          MatchState matchState = suggestionMatches.get(start).createState(language.getSynthesizer(), tokens, tokenIndex - 1 + i, skippedTokens);
          matchList.add(matchState.toFinalString(language));
        }
        return combineLists(matchList.toArray(new String[matchList.size()][]),
            new String[matchList.size()], 0, language);
      }
      return finalMatch;
    }
docs: Concatenates the matches, and takes care of phrases (including inflection
  using synthesis).
  @param start Position of the element as referenced by match element in the rule.
  @param index The index of the element found in the matching sentence.
  @param tokenIndex The position of the token in the AnalyzedTokenReadings array.
  @param tokens Array of AnalyzedTokenReadings
  @return @String[] Array of concatenated strings