public static RuleException getExceptionInfl()

in languagetool-language-modules/uk/src/main/java/org/languagetool/rules/uk/TokenAgreementPrepNounExceptionHelper.java [24:201]


  public static RuleException getExceptionInfl(AnalyzedTokenReadings[] tokens, int i, State state) {
    AnalyzedTokenReadings tokenReadings = tokens[i];
    String token = tokenReadings.getCleanToken();
    String tokenLower = token.toLowerCase();
    String prep = state.prepTokenReadings.getCleanToken().toLowerCase();

    
    // на дивом уцілілій техніці
    if( tokenReadings.getToken().equals("дивом") )
      return new RuleException(0);

    // в тисяча шістсот якомусь році
    if( i < tokens.length - 1 
        && tokenReadings.getToken().equals("тисяча")
        && (PosTagHelper.hasPosTagPart(tokens[i+1], "numr")
            || LemmaHelper.hasLemma(tokens[i+1], "якийсь"))) {
      return new RuleException(0);
    }
    // в дев'яносто восьмому
    if( i < tokens.length - 1 
        //tokenReadings.getToken().equals("тисяча")
        && PosTagHelper.hasPosTagPart(tokenReadings, "numr") && PosTagHelper.hasPosTagPart(tokenReadings, "v_naz")
        && PosTagHelper.hasPosTagPart(tokens[i+1], "numr") && PosTagHelper.hasPosTag(tokenReadings, Pattern.compile(".*v_(rod|dav|zna|oru|mis).*")) ) {
      return new RuleException(1);
    }

    if (prep.equals("на")) {
      // 1) на (свято) Купала, на (вулиці) Мазепи, на (вулиці) Тюльпанів
      if (LemmaHelper.isCapitalized(token) && PosTagHelper.hasPosTag(tokenReadings, Pattern.compile("noun.*?:.:v_rod.*"))) {
        return new RuleException(Type.exception);
      } 
      if (PosTagHelper.hasPosTag(tokenReadings, Pattern.compile("noun:anim:.:v_naz:prop:[fl]name.*"))
          && ((i > 1 && NAMES.contains(tokens[i-2].getAnalyzedToken(0).getToken()))
              || (i > 2 && NAMES.contains(tokens[i-3].getAnalyzedToken(0).getLemma())))) {
        return new RuleException(Type.exception);
      }

      if( tokenLower.matches("ти|ви") ) {
        return new RuleException(Type.exception);
      }

      // на Піп Іван
      if( i < tokens.length - 1
          && token.equals("Піп")
          && tokens[i+1].getCleanToken().equals("Іван") ) {
        return new RuleException(Type.exception);
      }

      // handled by xml rule
      if( tokenLower.equals("манер") ) {
        return new RuleException(Type.exception);
      }
    }

    // справедливості заради слід зазначити
    if( state.prepPos > 1 && prep.equals("заради") ) {
      if( tokens[state.prepPos-1].getCleanToken().matches("(?iu)справедливості|об.єктивності") ) {
        return new RuleException(Type.exception);
      }
    }


    // TODO: temporary until we have better logic - skip
    // при їх виборі
    if( prep.equals("при") ) {
      if( token.equals("їх") ) {
        return new RuleException(Type.skip);
      }
    }
    else
      if( prep.equals("з") ) {
        if( token.equals("рана") ) {
          return new RuleException(Type.exception);
        }
      }
      else
        if( prep.equals("від") ) {
          if( token.equalsIgnoreCase("а") || token.equals("рана") || token.equals("корки") || token.equals("мала") ) {  // корки/мала ловиться іншим правилом
            return new RuleException(Type.exception);
          }
        }
        else if( prep.equals("до") ) {
          if( token.equalsIgnoreCase("я") || token.equals("корки") || token.equals("велика") ) {  // корки/велика ловиться іншим правилом
            return new RuleException(Type.exception);
          }
        }

    
    // exceptions
    if( tokens.length > i+1 ) {
      //      if( tokens.length > i+1 && Character.isUpperCase(tokenReadings.getAnalyzedToken(0).getToken().charAt(0))
      //        && hasRequiredPosTag(Arrays.asList("v_naz"), tokenReadings)
      //        && Character.isUpperCase(tokens[i+1].getAnalyzedToken(0).getToken().charAt(0)) )
      //          continue; // "у Конан Дойла", "у Робін Гуда"

      // по Пенсильванія авеню
//      if( LemmaHelper.isCapitalized( token ) 
//          && LemmaHelper.CITY_AVENU.contains( tokens[i+1].getAnalyzedToken(0).getToken().toLowerCase() ) ) {
//        return new RuleException(Type.exception);
//      }

      // від мінус 1 до плюс 1
      if( (PosTagHelper.hasPosTagStart(tokens[i+1], "num")
            || tokens[i+1].getToken().equals("$"))
          && LemmaHelper.PLUS_MINUS.contains(tokenLower) ) {
        return new RuleException(Type.exception);
      }

      // на мохом стеленому дні - пропускаємо «мохом»
      if( PosTagHelper.hasPosTag(tokenReadings, "noun.*?:v_oru.*")
          && tokens[i+1].hasPartialPosTag("adjp:pasv") ) {
        return new RuleException(1);
      }

      if( token.equals("святая")
          && tokens[i+1].getToken().equals("святих") ) {
        return new RuleException(Type.exception);
      }

      if( (prep.equals("через") || prep.equals("на"))  // років 10, відсотки 3-4
          && (//PosTagHelper.hasPosTagStart(tokenReadings, "noun:inanim:p:v_naz") 
//              || PosTagHelper.hasPosTagStart(tokenReadings, "noun:inanim:p:v_rod")) // token.equals("років")
              LemmaHelper.hasLemma(tokenReadings, LemmaHelper.TIME_PLUS_LEMMAS, Pattern.compile("noun:inanim:p:v_(rod|zna).*")))
          && (tokens[i+1].hasPartialPosTag("num") // IPOSTag.isNum(tokens[i+1].getAnalyzedToken(0).getPOSTag())
              // відсотки зо 3
              || (i<tokens.length-2
                  && LemmaHelper.hasLemma(tokens[i+1], Arrays.asList("зо", "з", "із"))
                  && tokens[i+2].hasPartialPosTag("num")) ) ) {
        return new RuleException(Type.exception);
      }

      // на вами ж отриману 
//      if( (token.matches("вами|тобою|їми|мною|ним"))
//          && tokens[i+1].getCleanToken().matches("же?") ) {
//        return new RuleException(0);
//      }
      if( //(token.equals("собі") || token.equals("йому") || token.equals("їм"))
          PosTagHelper.hasPosTag(tokenReadings, Pattern.compile("noun.*v_dav.*:pron:(refl|pers).*"))
          && tokens[i+1].getCleanToken().startsWith("подібн") ) {
        return new RuleException(0);
      }
      if( (token.equals("усім") || token.equals("всім"))
          && tokens[i+1].getCleanToken().startsWith("відом") ) {
        return new RuleException(0);
      }

      if( prep.equalsIgnoreCase("до") && token.equals("схід") 
          && tokens[i+1].getCleanToken().equals("сонця") ) {
        return new RuleException(Type.exception);
      }

//      if( tokens[i+1].getToken().matches("[«„“\"]") 
//          && PosTagHelper.hasPosTagPart(tokens[i], ":abbr") ) {
//        return new RuleException(Type.exception);
//      }

      if( tokens.length > i+2 ) {
        // спиралося на місячної давнини рішення
        if (/*prep.equals("на") &&*/ PosTagHelper.hasPosTag(tokenReadings, "adj:[mfn]:v_rod.*")) {
          String genders = PosTagHelper.getGenders(tokenReadings, "adj:[mfn]:v_rod.*");

          if ( PosTagHelper.hasPosTag(tokens[i+1], "noun.*?:["+genders+"]:v_rod.*")) {
            i += 1;
            return new RuleException(1);
          }
        }

        if( // (token.equals("нікому") || token.equals("ніким") || token.equals("нічим") || token.equals("нічому"))
          PosTagHelper.hasPosTag(tokenReadings, Pattern.compile("noun.*v_(dav|oru).*:pron:neg.*"))
            && tokens[i+1].getCleanToken().equals("не")) {
          //          reqTokenReadings = null;
          return new RuleException(Type.skip);
        }
      }
    }

    return new RuleException(Type.none);
  }