class RussianTagger extends BaseTagger {

  public static final RussianTagger INSTANCE = new RussianTagger();

  public RussianTagger() {
    super("/ru/russian.dict", new Locale("ru"));
  }

  @Override
  public List<AnalyzedTokenReadings> tag(List<String> sentenceTokens) throws IOException {<FILL_FUNCTION_BODY>}

}

    List<AnalyzedTokenReadings> tokenReadings = new ArrayList<>();
    int pos = 0;
    for (String word : sentenceTokens) {
      boolean mayMissingYo = false;
      if (word.length() > 1) {
        if (!(word.contains("ё")) && !(word.contains("Ё")) && (word.contains("е") || word.contains("Е")) && !(word.contains("е́")) && !(word.contains("о́")) &&
          !(word.contains("а́")) && !(word.contains("у́")) && !(word.contains("и́")) && !(word.contains("ю́")) && !(word.contains("ы́")) && !(word.contains("э́")) &&
          !(word.contains("я́"))) {
          mayMissingYo = true;
        }
        word = word.replace("о́", "о");
        word = word.replace("а́", "а");
        word = word.replace("е́", "е");
        word = word.replace("у́", "у");
        word = word.replace("и́", "и");
        word = word.replace("ы́", "ы");
        word = word.replace("э́", "э");
        word = word.replace("ю́", "ю");
        word = word.replace("я́", "я");
        word = word.replace("о̀", "о");
        word = word.replace("а̀", "а");
        word = word.replace("ѐ", "е");
        word = word.replace("у̀", "у");
        word = word.replace("ѝ", "и");
        word = word.replace("ы̀", "ы");
        word = word.replace("э̀", "э");
        word = word.replace("ю̀", "ю");
        word = word.replace("я̀", "я");
        word = word.replace("ʼ", "ъ");
      }
      List<AnalyzedToken> l = getAnalyzedTokens(word);
      AnalyzedTokenReadings atr = new AnalyzedTokenReadings(l, pos);
      if (mayMissingYo) {
        String wordLc = word.toLowerCase().replace("е", "ё");
        if (getWordTagger().tag(wordLc).isEmpty()) {
          mayMissingYo = false;
        }
      }
      if (mayMissingYo) {
        List<ChunkTag> listChunkTags = new ArrayList<>();
        listChunkTags.add(new ChunkTag("MayMissingYO"));
        atr.setChunkTags(listChunkTags);
      }
      tokenReadings.add(atr);
      pos += word.length();
    }
    return tokenReadings;
  
<methods>public void <init>(java.lang.String, java.util.Locale) ,public void <init>(java.lang.String, java.util.Locale, boolean) ,public void <init>(java.lang.String, java.util.Locale, boolean, boolean) ,public final org.languagetool.AnalyzedTokenReadings createNullToken(java.lang.String, int) ,public org.languagetool.AnalyzedToken createToken(java.lang.String, java.lang.String) ,public java.lang.String getDictionaryPath() ,public List<java.lang.String> getManualAdditionsFileNames() ,public List<java.lang.String> getManualRemovalsFileNames() ,public boolean overwriteWithManualTagger() ,public List<org.languagetool.AnalyzedTokenReadings> tag(List<java.lang.String>) throws java.io.IOException<variables>private static final java.lang.String CUSTOM_MANUAL_ADDITIONS_FILE,private static final java.lang.String CUSTOM_MANUAL_REMOVALS_FILE,private static final java.lang.String MANUAL_ADDITIONS_FILE,private static final java.lang.String MANUAL_REMOVALS_FILE,private final non-sealed Dictionary#RAW dictionary,private final non-sealed java.lang.String dictionaryPath,protected final non-sealed java.util.Locale locale,private final non-sealed boolean tagLowercaseWithUppercase,protected final non-sealed org.languagetool.tagging.WordTagger wordTagger