bool CRusFormatCaller::format_for_modif_adj_groups (CGroup& G) { if (get_maximal_group_no(G.m_iFirstWord) != -1) return false; int j = G.m_iFirstWord; if( FindInList((const char*)g_strAdjModif, g_AdjModifCount, Wj.get_lemma()) == -1) return false; if( j+1 >= sent.size() ) return false; const CGroup& H = get_maximal_group(j+1); if( !is_morph_adj(sent[H.m_MainWordNo]) ) return false; if( !GetGramTab()->GleicheGenderNumberCase(sent[H.m_MainWordNo].m_type_gram_code, sent[H.m_MainWordNo].m_gramcodes, Wj.m_gramcodes ) ) return false; G.m_iLastWord = H.m_iLastWord; G.m_GroupType = MODIF_ADJ; G.SetGrammems (H.GetGrammems() & sent[j].GetGrammems()); G.m_MainGroup = H; change_words_in_group_grammems(G, G.GetGrammems(), (rAllNumbers | rAllCases)); create_syn_rel(G, H.m_MainWordNo, j , MODIF_ADJ); return true; }
// Kanzler Gerhard Schröder // Bundeskanzler Alexey Sokirko // A-Techniker Gerhard Schroder bool CGerFormatCaller :: format_for_rank_fam (CGroup& G) { int i = get_main_word(G.m_iFirstWord); if (!Wi.m_lemma) return false; if ( !Wi.HasFlag(fl_ranknoun) ) return false; size_t j = 0; const CGroup& main_gr = get_maximal_group(G.m_iFirstWord); j = main_gr.m_iLastWord+1; if ( j == sent.size() ) return false; const CGroup& next_gr = get_maximal_group(j); if ( next_gr.m_GroupType!= gFAMILIE_GROUP && next_gr.m_GroupType!= gSPNAME && next_gr.m_GroupType!= gPNAME ) return false; G.m_iLastWord = next_gr.m_iLastWord; G.SetGrammems( Wi.GetGrammems() ); G.m_MainGroup = main_gr; G.m_GroupType = gBERUF_NP; create_syn_rel(G,i,j,gBERUF_NP); return true; };
// Правила для БОЛЕЕ или МЕНЕЕ + прил или кр.прил bool CRusFormatCaller::format_for_anat_compar(CGroup& G) { //более извращенная любительница size_t i = G.m_iFirstWord; const CGroup& MaxGrp = get_maximal_group(i); if (MaxGrp.m_iFirstWord != MaxGrp.m_iLastWord) return false; if ( !Wi.is_word_upper("БОЛЕЕ") && !Wi.is_word_upper("МЕНЕЕ") ) return false; size_t j = i + 1; if (j >= sent.size()) return false; if (get_maximal_group_size(j) != 1) return false; if (is_morph_adj(Wj) || is_morph_participle (Wj)) { G.m_GroupType = ANAT_COMPAR; G.m_iLastWord = j; G.m_MainGroup.m_iFirstWord = j; G.m_MainGroup.m_iLastWord = j; G.SetGrammems( Wj.GetGrammems() ); create_syn_rel(G, j, i, ANAT_COMPAR); return true; } return false; };
bool CRusFormatCaller :: format_for_rank_surname (CGroup& G) { const CGroup& main_gr = get_maximal_group(G.m_iFirstWord); int i = main_gr.m_MainWordNo; if (!Wi.get_lemma()) return false; if ( !Wi.HasFlag(fl_ranknoun) ) return false; size_t j = main_gr.m_iLastWord+1; if ( j == sent.size() ) return false; j = get_main_word(j); if ( !Wj.has_grammem( rSurName ) && !Wj.has_grammem( rName ) ) return false; if ( !GetGramTab()->GleicheCaseNumber(Wi.GetGramcodes(), Wj.GetGramcodes()) ) return false; G.m_iLastWord = get_maximal_group(j).m_iLastWord; G.SetGrammems( Wi.GetGrammems() ); G.m_MainGroup = main_gr; G.m_GroupType = RANK_NAMES; G.m_Cause = "Правила сборки Должность+ФИО"; create_syn_rel(G,i,j,RANK_NAMES); return true; };
bool CGerFormatCaller :: format_for_geo_names (CGroup& G) { size_t j = get_main_word(G.m_iFirstWord); if (!CanBeCityType(Wj)) return false; size_t i = j; if( ++i >= sent.size() ) return false; int main_word = get_main_word(i); if (main_word == -1) return false; if ( !sent[main_word].HasFlag(fl_morph_predicted) && !sent[main_word].has_grammem(gStd) ) return false; G.m_iLastWord = get_maximal_group(i).m_iLastWord; G.m_GroupType = gGEOGR; G.SetGrammems( get_maximal_group(j).GetGrammems() ); G.m_MainGroup = get_maximal_group(j); create_syn_rel(G, j, main_word, gGEOGR); return true; };
// Правила для обособ. прил. в постпозиции\\Этим вопросом, давно и надолго забытым, \\. bool CRusFormatCaller::format_for_noun_detached_adj_postposition(CGroup& G) { size_t i, j; i = G.m_iFirstWord; const CGroup& MaxGrp = get_maximal_group(i); if (MaxGrp.m_iFirstWord != MaxGrp.m_iLastWord) i = MaxGrp.m_MainWordNo; else i = MaxGrp.m_iFirstWord; if ( !Wi.is_morph_noun() && !is_morph_pronoun(Wi)) return false; j = MaxGrp.m_iLastWord + 1; if (j == sent.size()) return false; if (!Wj.HasFlag(fl_comma)) return false; j++; if (j == sent.size()) return false; const CGroup& MaxGrpAdj = get_maximal_group(j); if (MaxGrpAdj.m_iFirstWord != MaxGrpAdj.m_iLastWord) j = MaxGrpAdj.m_MainWordNo; else j = MaxGrpAdj.m_iFirstWord; if (!is_morph_adj(Wj)) return false; if ( !(MaxGrpAdj.m_iLastWord == sent.size()-1) && !sent[MaxGrpAdj.m_iLastWord+1].HasFlag(fl_comma) ) return false; bool bGr = false; if ( GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(),Wj.GetGramcodes()) ) bGr = true; if ((Wi.GetGrammems() & (1 <<rPlural)) && (Wj.GetGrammems() & (1 <<rSingular))) if ( GetGramTab()->GleicheCase(Wi.GetGramcodes(), Wj.GetGramcodes())) bGr = true; if ((Wi.GetGrammems() & (1 <<rSingular)) && (Wj.GetGrammems() & (1 <<rPlural))) if (GetGramTab()->GleicheCase(Wi.GetGramcodes(), Wj.GetGramcodes())) bGr = true; if (bGr == true) { G.m_GroupType = NOUN_DETACHED_ADJ; G.m_iFirstWord = MaxGrp.m_iFirstWord; G.m_iLastWord = MaxGrpAdj.m_iLastWord; G.m_MainGroup = MaxGrp; G.SetGrammems( Wi.GetGrammems() ); create_syn_rel(G, i, j, NOUN_DETACHED_ADJ); return true; } return false; };
// Правила для "черная и белая ракетки; черные шкаф и стул" bool CRusFormatCaller::format_for_plural_noun_adj(CGroup& G) { const CGroup& AdjMaxGrp = get_maximal_group(G.m_iFirstWord); size_t adj_main_word = get_main_word_in_group(AdjMaxGrp); const CSynPlmLine& Adj = sent[adj_main_word]; size_t noun_main_word = get_next_main_word(adj_main_word); if (noun_main_word == sent.size()) return false; const CSynPlmLine& Noun = sent[noun_main_word]; const CGroup& NounMaxGrp = get_maximal_group(noun_main_word); if (!Adj.GetGramcodes() || !Noun.GetGramcodes()) return false; bool bCase1 = ( (AdjMaxGrp.m_GroupType == SIMILAR_ADJS) && (Noun.GetGrammems() & _QM(rPlural)) && Noun.is_morph_noun( ) && (NounMaxGrp.size() == 1) && GetGramTab()->GleicheCase(Adj.GetGramcodes(), Noun.GetGramcodes()) ); bool bCase2 = ( (NounMaxGrp.m_GroupType == SIMILAR_NOUN_GROUPS) && Noun.is_morph_noun( ) && (Adj.GetGrammems() & _QM(rPlural)) && (Noun.GetGrammems() & _QM(rSingular)) && AdjMaxGrp.size() == 1 && is_morph_adj(Adj) && GetGramTab()->GleicheCase(Adj.GetGramcodes(),Noun.GetGramcodes()) ); if (bCase1 || bCase2) { G.m_GroupType = NOUN_ADJ; G.m_iFirstWord = AdjMaxGrp.m_iFirstWord; G.m_iLastWord = NounMaxGrp.m_iLastWord; G.m_MainGroup = NounMaxGrp; G.SetGrammems( NounMaxGrp.GetGrammems() ); create_syn_rel(G, noun_main_word, adj_main_word, NOUN_ADJ); return true; } return false; };
bool CGerFormatCaller::format_for_genit_NP (CGroup& G) { const CGroup& MainGroup = get_maximal_group(G.m_iFirstWord); int i = get_main_word_in_group(MainGroup); if (!is_morph_noun(sent[i])) return false; if (MainGroup.m_iLastWord+1 == sent.size()) return false; const CGroup& GenitGroup = get_maximal_group(MainGroup.m_iLastWord+1); int j = get_main_word_in_group(GenitGroup); //if ( (GenitGroup.GetGrammems() & gAllCases) != _QM(gGenitiv) ) return false; if ( !(GenitGroup.GetGrammems() & _QM(gGenitiv)) ) return false; if ( !is_morph_noun(sent[j]) && !sent[j].HasFlag(fl_adjective_as_noun) ) { return false; }; if ( (GenitGroup.GetGrammems() & gAllCases) != _QM(gGenitiv) ) { if ( (GenitGroup.m_GroupType != gDET_ADJ_NOMEN) && (GenitGroup.m_GroupType != gADJ_NOMEN) ) return false; if ( (GenitGroup.size() == 2) && IstZahlWort(sent[GenitGroup.m_iFirstWord]) ) return false; }; G.m_GroupType = gGENIT_NP; G.m_MainGroup = MainGroup; G.m_iLastWord = GenitGroup.m_iLastWord; G.SetGrammems( MainGroup.GetGrammems() ); create_syn_rel(G, i, j, gGENIT_NP); return true; };
// Правила для \\Человек этот, неожиданно увидев нечто впечатляющее, отпрянул, но ничего страшного не произошло\\. bool CRusFormatCaller::format_for_noun_adj_postposition(CGroup& G) { int i = get_main_word (G.m_iFirstWord); if (!Wi.is_morph_noun()) return false; if (Wi.m_UnitType != EWord) return false; int j = get_next_main_word(i); if (j == sent.size()) return false; if (!is_morph_adj(Wj)) return false; if (Wj.m_UnitType != EWord) return false; if (! GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(), Wj.GetGramcodes()) ) return false; G.m_GroupType = NOUN_ADJ_POSTPOSITION; G.m_iLastWord = get_maximal_group(j).m_iLastWord; G.m_MainGroup = get_maximal_group(i); G.SetGrammems( Wi.GetGrammems() ); create_syn_rel(G, i, j, NOUN_ADJ_POSTPOSITION); return true; };
bool CGerFormatCaller::format_for_genit_in_preposition(CGroup& G) { const CGroup& GenitGroup = get_maximal_group(G.m_iFirstWord); int i = get_main_word_in_group(GenitGroup); if (!is_morph_noun(sent[i])) return false; if (GenitGroup.m_iLastWord+1 == sent.size()) return false; if ( (GenitGroup.GetGrammems() & gAllCases) != _QM(gGenitiv) ) return false; const CGroup& MainGroup = get_maximal_group(GenitGroup.m_iLastWord+1); int j = get_main_word_in_group(MainGroup); if (!is_morph_noun(sent[j]) ) return false; G.m_GroupType = gGENIT_PRE; G.m_MainGroup = MainGroup; G.m_iLastWord = MainGroup.m_iLastWord; G.SetGrammems( MainGroup.GetGrammems() ); create_syn_rel(G, j, i, gGENIT_NP); return true; };
bool CGerFormatCaller :: format_for_adv_zal (CGroup& G) { size_t i = get_main_word(G.m_iFirstWord); if( get_maximal_group_no(i) != -1 ) return false; if (CanBeNumeralModifier(Wi)) { i++; } else if ( (i+1 < sent.size()) && sent[i].is_lemma("BIS") && sent[i+1].is_lemma("ZU") ) { i+=2; } else return false; if( i >= sent.size() ) return false; int main_word = get_main_word(i); if( !IstZahlWort(sent[main_word]) ) return false; G.m_iLastWord = get_maximal_group(i).m_iLastWord; G.m_GroupType = gMODIF_NUMER; G.SetGrammems( get_maximal_group(i).GetGrammems() ); G.m_MainGroup = get_maximal_group(i); create_syn_rel(G, get_main_word(G.m_iLastWord) , get_main_word(G.m_iFirstWord), gMODIF_NUMER); return true; };
bool CRusFormatCaller :: format_for_adj_in_commas_preposition(CGroup& G) { int i = get_main_word (G.m_iFirstWord); if (i != G.m_iFirstWord) return false; if (!is_morph_pronoun(Wi)) return false; if (i < 2) return false; if (!sent[i-1].HasFlag(fl_comma) ) return false; size_t j = i-2; const CGroup& MaxGrp = get_maximal_group(j); if (MaxGrp.m_iLastWord == j && MaxGrp.m_iFirstWord == j) j = j; else j = MaxGrp.m_MainWordNo; if (!is_morph_adj(Wj)) return false; bool vB = false; if (MaxGrp.m_iLastWord == 0) vB = true; else if (MaxGrp.m_iFirstWord >0 && sent[MaxGrp.m_iFirstWord-1].HasFlag(fl_comma)) vB = true; if ( GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(), Wj.GetGramcodes()) ) { G.m_GroupType = NOUN_ADJ; G.m_iLastWord = i; G.m_iFirstWord = MaxGrp.m_iFirstWord; G.m_MainGroup.m_iFirstWord = i; G.m_MainGroup.m_iLastWord = i; G.SetGrammems( Wi.GetGrammems() ); return true; } return false; };
bool CRusFormatCaller::format_for_noun_groups (CGroup& G) { const CGroup& FirstChild = get_maximal_group(G.m_iFirstWord); if (FirstChild.m_iFirstWord != G.m_iFirstWord) return false; int i = get_main_word_in_group(FirstChild); if (!is_left_noun_modifier (Wi)) return false; if( Wi.is_lemma("КОТОРЫЙ") ) return false; string debug_str; bool bFound_VSE = false; //слово "всe" начинает группу bool bFoundParticiple = false; //нашли дст., пе, причастие bool bAdjShouldBeInNominativOrGenitiv = false; //чтобы собрать "две красивых девочки" //gleiche_for_small_numbers int NounGroupNo; if( Wi.get_upper_word() && !strcmp(Wi.get_upper_word(), "ВСЕ") && Wi.is_lemma("ВЕСЬ") && (get_maximal_group_size(i) == 1) ) bFound_VSE = true; if ( Wi.has_grammem(rActiveVoice) && Wi.has_grammem(rTransitive) && Wi.HasPOS(PARTICIPLE) ) bFoundParticiple = true; if ((G.m_iFirstWord+1) >= sent.size()) return false; // собираем группу "сам себя" int j; if ( Wi.is_lemma( "САМ") ) { G.m_iLastWord = get_maximal_group(G.m_iFirstWord).m_iLastWord + 1; if (G.m_iLastWord < sent.size()) { NounGroupNo = get_maximal_group_no(G.m_iLastWord); j = (NounGroupNo == -1 ) ? G.m_iLastWord : GetGroups()[NounGroupNo].m_MainWordNo; if ( Wj.is_lemma("СЕБЯ") || Wj.is_lemma("ТЫ") || Wj.is_lemma("Я") || Wj.is_lemma("МЫ") // "сами мы не местные" ) if ((Wi.GetGrammems() & Wj.GetGrammems() & rAllCases) > 0) { i = j; G.SetGrammems (Wi.GetGrammems() & Wj.GetGrammems() & (rAllCases | rAllGenders)); goto CreateGroup; }; }; }; // нахождение последовательности П1 ... Пn С, где Пi - прилагательное или группа прилагательных, // а С - ИГ. // Согласование по падежу, числу и роду будет проверяться в другом цикле. G.SetGrammems ( Wi.GetGrammems() ); for ( G.m_iLastWord = get_maximal_group(G.m_iFirstWord).m_iLastWord + 1; G.m_iLastWord < sent.size(); G.m_iLastWord = get_maximal_group(G.m_iLastWord).m_iLastWord + 1 ) { int i_gr = get_maximal_group_no(G.m_iLastWord); i = (i_gr == -1) ? G.m_iLastWord:GetGroups()[i_gr].m_MainWordNo; if( Wi.is_lemma("КОТОРЫЙ") ) return false; if( i_gr != -1 ) { G.SetGrammems (G.GetGrammems() & GetGroups()[i_gr].GetGrammems()); } else { G.SetGrammems( G.GetGrammems() & Wi.GetGrammems() ); if( GetGramTab()->IsSimpleParticle(Wi.get_lemma(), Wi.GetPoses()) && (i > G.m_iFirstWord) ) continue; } if ( !is_left_noun_modifier (Wi)) break; if ( Wi.has_grammem(rActiveVoice) && Wi.has_grammem(rTransitive) && Wi.HasPOS(PARTICIPLE) ) bFoundParticiple = true; }; // end of for by "G.m_iLastWord" if (G.m_iLastWord < sent.size()) G.m_iLastWord = get_maximal_group(G.m_iLastWord).m_iLastWord; /* если дошли до конца или в конце не стоит существительного тогда пробуем собрать группу "все это" ("это" - не является синтаксическим cуществительным) или группу "все лишнее" */ if (G.m_iLastWord >= sent.size() || !Wi.is_syn_noun()) { // если самое первое слово ИГ было "всe" if( bFound_VSE ) { // возвращаемся на одно слово назад G.m_iLastWord--; if( G.size() != 2 ) return false; i = G.m_iLastWord; if( ( get_maximal_group_size(i) == 1) && GetGramTab()->IsSimpleParticle(Wi.get_lemma(), Wi.GetPoses()) ) G.m_iLastWord++; if (G.m_iLastWord >= sent.size()) return false; if( get_maximal_group_size(G.m_iLastWord) > 1) return false; if( sent[G.m_iLastWord].m_UnitType != EWord) return false; i = get_main_word(G.m_iLastWord); if( !is_left_noun_modifier (Wi) ) return false; if( !is_left_noun_modifier (Wi) ) return false; } else return false; } if( bFoundParticiple ) if( (Wi.GetGrammems() & _QM(rAccusativ)) && (G.GetGrammems() & _QM(rAccusativ)) ) return false; // Берем группу, которая могла быть построена на найденном существительном, // группа может прийти из тезауруса или ЧИСЛ-СУЩ, например: "первые пять человек", size_t FirstWordOfNounGroup; NounGroupNo = get_maximal_group_no(i); if( NounGroupNo != -1) { FirstWordOfNounGroup = GetGroups()[NounGroupNo].m_iFirstWord; G.SetGrammems ( GetGroups()[NounGroupNo].GetGrammems() ); } else { FirstWordOfNounGroup = i; G.SetGrammems( Wi.GetGrammems() ); }; if( G.m_iFirstWord > 0 ) { QWORD dummy; //gleiche_for_plural_numbers(i, G.m_iFirstWord - 1, false, dummy, bAdjShouldBeInNominativOrGenitiv, is_small_number_group(G.m_iFirstWord - 1)); } if ( sent[G.m_iFirstWord].HasFlag(fl_digit) && sent[G.m_iFirstWord].HasPOS(NUMERAL_P) && sent[FirstWordOfNounGroup].HasFlag(fl_ile) ) // "вызвать 5 API" return false; // Согласование по падежу, числу и роду проверяться здесь. for (j = G.m_iFirstWord; j < FirstWordOfNounGroup; j = get_maximal_group(j).m_iLastWord + 1) { const CGroup& LastHost = get_maximal_group(j); int MainWordNo = LastHost.m_MainWordNo; if( (LastHost.size() == 1) && GetGramTab()->IsSimpleParticle(Wj.get_lemma(), Wj.GetPoses()) ) continue; if ( !bAdjShouldBeInNominativOrGenitiv ) { // проверяем согласование между прилагательным и существительным QWORD CommonGrams = GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.m_gramcodes, sent[MainWordNo].m_gramcodes); if (!CommonGrams) if ( NounGroupNo != -1 && GetGroups()[NounGroupNo].m_GroupType == NUMERAL_NOUN && (sent[MainWordNo].GetGrammems() & G.GetGrammems() & rAllNumbers) && (sent[MainWordNo].GetGrammems() & G.GetGrammems() & rAllCases) ) CommonGrams = sent[MainWordNo].GetGrammems(); else return false; // если главный элемент в ПРИЛ_СУЩ является однородным рядом, тогда нужно проверить, что // данное прилагательное согласовано со всеми членами однородного ряда по падежу (по числу и роду может быть не согласовано) // иначе вся фразы "Советской гавани, он" покрывается одним ПРИЛ_СУЩ if (NounGroupNo != -1) if (GetGroups()[NounGroupNo].m_GroupType == SIMILAR_NOUN_GROUPS) if ( (Wi.GetGrammems() & GetGroups()[NounGroupNo].GetGrammems() & rAllCases) == 0) return false; G.SetGrammems( G.GetGrammems() & CommonGrams); } else { if ( ( !(sent[MainWordNo].GetGrammems() & _QM(rGenitiv)) && !(sent[MainWordNo].GetGrammems() & _QM(rNominativ)) ) || !( sent[MainWordNo].GetGrammems() & _QM(rPlural)) ) return false; G.SetGrammems(G.GetGrammems() & sent[MainWordNo].GetGrammems()); }; } // end of cycle by "j" if( bAdjShouldBeInNominativOrGenitiv ) if( NounGroupNo == -1 ) G.SetGrammems( Wi.GetGrammems()); else G.SetGrammems( GetGroups()[NounGroupNo].GetGrammems() ); debug_str = GetGramTab()->GrammemsToStr(G.GetGrammems()); debug_str = GetGramTab()->GrammemsToStr(W2.GetGrammems()); G.m_Cause = "ИГ, согласованная по роду, числу и падежу"; if (is_morph_pronoun(Wi)) return false; CreateGroup: if ((G.GetGrammems() & rAllNumbers) == _QM(rSingular)) change_words_in_group_grammems(G, G.GetGrammems(), (rAllNumbers | rAllGenders | rAllCases)); else change_words_in_group_grammems(G, G.GetGrammems(), (rAllNumbers | rAllCases)); G.m_MainGroup = get_maximal_group(i); debug_str = GetGramTab()->GrammemsToStr(W2.GetGrammems()); G.m_iLastWord = G.m_MainGroup.m_iLastWord; G.m_GroupType = NOUN_ADJ; debug_str = GetGramTab()->GrammemsToStr(G.GetGrammems()); { size_t k = G.m_iFirstWord; size_t last = get_maximal_group(G.m_iLastWord).m_iFirstWord; while (k < last) { const CGroup& H = get_maximal_group(k); create_syn_rel(G, i, H.m_MainWordNo, NOUN_ADJ); k += H.size(); } } return true; };
bool CRusFormatCaller::format_for_whose_clause(CGroup& G) //правило построения группы с придаточным определительным; { int j; int i = get_main_word (G.m_iFirstWord); if (i != G.m_iFirstWord) return false; if (Wi.m_UnitType == EWord) return false; if (!Wi.HasFlag(fl_relative_clause)) return false; if (i == 0) return false; const CGroup& MaxGrp = get_maximal_group(i-1); for (j = MaxGrp.m_iLastWord; j >= MaxGrp.m_iFirstWord; j--) { assert(j != -1); if ( !Wj.is_morph_noun()) continue; int m = -1; for (int f = 0; f < GetGroups().size(); f++) if (GetGroups()[f].m_iFirstWord <= j && GetGroups()[f].m_iLastWord == i-1) { m = f; break; } int varMainWrd; if (m != -1) varMainWrd = GetGroups()[m].m_MainWordNo; else varMainWrd = j; if ( GetGramTab()->GleicheGenderNumber(Wi.m_gramcodes, Wj.m_gramcodes ) ) if (varMainWrd == j || j == i-1) { G.m_GroupType = WHOSE_SUBORDINATE; G.m_iLastWord = G.m_iFirstWord; if (varMainWrd == j && m != -1) G.m_iFirstWord = GetGroups()[m].m_iFirstWord; else G.m_iFirstWord = j; G.m_MainGroup.m_iFirstWord = G.m_iFirstWord; if (varMainWrd == j && m != -1) G.m_MainGroup.m_iLastWord = GetGroups()[m].m_iLastWord; else G.m_MainGroup.m_iLastWord = j; G.SetGrammems( Wj.GetGrammems() ); for (m = GetGroups().size()-1; m >= 0; m--) { if (GetGroups()[m].m_iFirstWord < G.m_iFirstWord && GetGroups()[m].m_iLastWord == i-1) m_GroupsToRebuild.push_back(GetGroups()[m]); }; return true; } if (m != -1 && GetGroups()[m].m_iLastWord == i-1) if (GetGroups()[m].m_GroupType == SIMILAR_NOUN_GROUPS) if (GetGramTab()->GleicheCase(Wi.m_gramcodes, Wj.m_gramcodes) ) { G.m_GroupType = WHOSE_SUBORDINATE; G.m_iLastWord = G.m_iFirstWord; G.m_iFirstWord = GetGroups()[m].m_iFirstWord; G.m_MainGroup.m_iFirstWord = GetGroups()[m].m_iFirstWord; G.m_MainGroup.m_iLastWord = GetGroups()[m].m_iLastWord; G.SetGrammems ( GetGroups()[m].GetGrammems() ); for (m = GetGroups().size()-1; m >= 0; m--) if (GetGroups()[m].m_iFirstWord < G.m_iFirstWord && GetGroups()[m].m_iLastWord == i-1) m_GroupsToRebuild.push_back(GetGroups()[m]); return true; } } return false; };
bool CRusFormatCaller::format_for_partic_clause(CGroup& G) { int j; int i = get_main_word (G.m_iFirstWord); if (i != G.m_iFirstWord) return false; if (Wi.m_UnitType == EWord) return false; if (Wi.m_ClauseType != PARTICIPLE_T) return false; if (i == 0) return false; const CGroup& MaxGrp = get_maximal_group(i-1); for (j = MaxGrp.m_iLastWord; j >= MaxGrp.m_iFirstWord; j--) { assert(j != -1); if ( !Wj.is_morph_noun()) continue; if ( Wj.HasFlag(fl_ile)) continue; int m = -1; for (int f = 0; f < GetGroups().size(); f++) if (GetGroups()[f].m_iFirstWord <= j && GetGroups()[f].m_iLastWord == i-1) { m = f; break; } int varMainWrd; if (m != -1) varMainWrd = GetGroups()[m].m_MainWordNo; else varMainWrd = j; if ( GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.m_gramcodes, Wj.m_gramcodes ) || ( sent[MaxGrp.m_iFirstWord].HasFlag(fl_small_number) && ((Wi.GetGrammems() & ( (1 << rGenitiv) | (1 << rPlural))) == ( (1 << rGenitiv) | (1 << rPlural)) ) ) ) if (varMainWrd == j || j == i-1) { G.m_GroupType = NOUN_PARTICIPLE; G.m_iLastWord = get_maximal_group(G.m_iFirstWord).m_iLastWord; if (varMainWrd == j && m != -1) G.m_iFirstWord = GetGroups()[m].m_iFirstWord; else G.m_iFirstWord = j; G.m_MainGroup.m_iFirstWord = G.m_iFirstWord; if (varMainWrd == j && m != -1) G.m_MainGroup.m_iLastWord = GetGroups()[m].m_iLastWord; else G.m_MainGroup.m_iLastWord = j; G.SetGrammems( Wj.GetGrammems() ); for (m = GetGroups().size()-1; m >= 0; m--) if ( GetGroups()[m].m_iFirstWord < G.m_iFirstWord && GetGroups()[m].m_iLastWord == i-1 ) m_GroupsToRebuild.push_back(GetGroups()[m]); return true; } if (m != -1 && GetGroups()[m].m_iLastWord == i-1) if (GetGroups()[m].m_GroupType == SIMILAR_NOUN_GROUPS) if (GetGramTab()->GleicheCase(Wi.m_gramcodes,Wj.m_gramcodes)) { G.m_GroupType = NOUN_PARTICIPLE; G.m_iLastWord = G.m_iFirstWord; G.m_iFirstWord = GetGroups()[m].m_iFirstWord; G.m_MainGroup.m_iFirstWord = GetGroups()[m].m_iFirstWord; G.m_MainGroup.m_iLastWord = GetGroups()[m].m_iLastWord; G.SetGrammems( GetGroups()[m].GetGrammems() ); for (m = GetGroups().size()-1; m >= 0; m--) if (GetGroups()[m].m_iFirstWord < G.m_iFirstWord && GetGroups()[m].m_iLastWord == i-1) m_GroupsToRebuild.push_back(GetGroups()[m]); return true; } } return false; };