package org.languagetool.rules.uk; import java.util.Collections; import java.util.List; import java.util.regex.Pattern; import org.languagetool.AnalyzedToken; import org.languagetool.AnalyzedTokenReadings; import org.languagetool.rules.uk.LemmaHelper.Dir; import org.languagetool.tagging.uk.PosTagHelper; /** * @since 3.6 */ public final class TokenVerbAgreementExceptionHelper { private TokenVerbAgreementExceptionHelper() { } public static boolean isException(AnalyzedTokenReadings[] tokens, int i, List<TokenVerbAgreementRule.Inflection> masterInflections, List<TokenVerbAgreementRule.Inflection> slaveInflections, List<AnalyzedToken> nounTokenReadings, List<AnalyzedToken> verbTokenReadings) { if( PosTagHelper.hasPosTag(verbTokenReadings, ".*:p(:.*|$)") ) { // моя мама й сестра мешкали if( LemmaHelper.tokenSearch(tokens, i-2, null, TokenInflectionExceptionHelper.CONJ_FOR_PLULAR_PATTERN, Pattern.compile("(noun|adj).*"), Dir.REVERSE) != -1 ) { logException(); return true; } // Бразилія, Мексика, Індія збувають int pos = LemmaHelper.tokenSearch(tokens, i-2, null, Pattern.compile(","), Pattern.compile("adj.*"), Dir.REVERSE); if( pos > 1 && PosTagHelper.hasPosTagPart(tokens[pos-1], "noun") ) { logException(); return true; } } // не встиг я отямитися // Хотів би я подивитися int verbPos = LemmaHelper.tokenSearch(tokens, i-2, "verb", null, Pattern.compile("(adv|part).*"), Dir.REVERSE); if( verbPos != -1 && PosTagHelper.hasPosTag(verbTokenReadings, "verb.*:inf.*") && ! Collections.disjoint(TokenVerbAgreementRule.getVerbInflections(tokens[verbPos].getReadings()), masterInflections) ) { logException(); return true; } // чи готові ми сидіти без світла if( i > 1 && PosTagHelper.hasPosTagPart(tokens[i-2], "adj") && PosTagHelper.hasPosTag(verbTokenReadings, "verb.*:inf.*") && CaseGovernmentHelper.hasCaseGovernment(tokens[i-2], "v_inf") && ! Collections.disjoint(InflectionHelper.getAdjInflections(tokens[i-2].getReadings()), InflectionHelper.getNounInflections(nounTokenReadings))) { logException(); return true; } // що ми зробити не зможемо verbPos = LemmaHelper.tokenSearch(tokens, i+1, "verb", null, Pattern.compile("(adv|part).*"), Dir.FORWARD); if( verbPos != -1 && PosTagHelper.hasPosTag(verbTokenReadings, "verb.*:inf.*") && ! Collections.disjoint(TokenVerbAgreementRule.getVerbInflections(tokens[verbPos].getReadings()), masterInflections) ) { logException(); return true; } // ми розраховувати не повинні int adjPos = LemmaHelper.tokenSearch(tokens, i+1, "adj", null, Pattern.compile("(adv|part).*"), Dir.FORWARD); if( adjPos != -1 && PosTagHelper.hasPosTag(verbTokenReadings, "verb.*:inf.*") && CaseGovernmentHelper.hasCaseGovernment(tokens[adjPos], "v_inf") && ! Collections.disjoint(InflectionHelper.getAdjInflections(tokens[adjPos].getReadings()), InflectionHelper.getNounInflections(nounTokenReadings)) ) { logException(); return true; } // решта забороняються if( tokens[i-1].getToken().equalsIgnoreCase("решта") && PosTagHelper.hasPosTag(verbTokenReadings, ".*:p(:.*|$)") ) { logException(); return true; } // тому, що як австрієць маєте if( PosTagHelper.hasPosTag(tokens[i-1], "noun.*:v_naz.*") && LemmaHelper.tokenSearch(tokens, i-2, null, Pattern.compile("[Яя]к"), Pattern.compile("adj.*"), Dir.REVERSE) != -1 ) { logException(); return true; } return false; } private static void logException() { if( TokenVerbAgreementRule.DEBUG ) { StackTraceElement stackTraceElement = new Exception().getStackTrace()[1]; System.err.println("exception: " + stackTraceElement.getFileName() + ": " + stackTraceElement.getLineNumber()); } } }