protected void Sklonenie(ref Slovo slovo) { RuMorf ruMorf = AnalyzeRuMorf(slovo); RuMorf izmRuMorf = new RuMorf(ruMorf.osnova,""); Zaliznyak z = new Zaliznyak(); string s = (string)(z.GetStrict(slovo.rSlovo.Replace("ё","е")))[0]; string paradigma = s.Split(';')[1]; string digits = "0123456789"; string osnBukvSimvol = s.Substring(s.IndexOfAny(digits.ToCharArray())); osnBukvSimvol = osnBukvSimvol.Substring(osnBukvSimvol.IndexOf(' ')); string indexes = (osnBukvSimvol.IndexOfAny(digits.ToCharArray()) != -1)?osnBukvSimvol.Substring(osnBukvSimvol.IndexOfAny(digits.ToCharArray())):"1"; if(osnBukvSimvol.IndexOfAny(digits.ToCharArray())!= -1) osnBukvSimvol = osnBukvSimvol.Substring(0,osnBukvSimvol.IndexOfAny(digits.ToCharArray())); char firstIndex = indexes[0]; char secondIndex = ' '; if(indexes.Length>1) secondIndex = indexes[1]; if(secondIndex == '*') secondIndex = indexes[2]; char posl = ruMorf.osnova[ruMorf.osnova.Length-1]; bool posl_is_ship = (posl=='ч')||(posl=='ш')||(posl=='щ')||(posl=='ж'); bool udarnoe = false; if(slovo.ruSlovo.ruChislo == RuChislo.Edinstvennoe) udarnoe = (secondIndex == 'в' || secondIndex == 'D' || secondIndex == 'f'); else { if(slovo.ruSlovo.ruPadezh == RuPadezh.Imenitelniy) udarnoe = (secondIndex == 'в' || secondIndex == 'с'); else udarnoe = (secondIndex == 'в' || secondIndex == 'с' || secondIndex == 'е' || secondIndex == 'f'); } izmRuMorf.okonchanie = OkonchanieSklonenia(ruMorf.okonchanie,firstIndex,slovo.ruSlovo.ruPadezh,slovo.ruSlovo.ruRod,slovo.odushevlennost,udarnoe,posl_is_ship,slovo.ruSlovo.ruChislo,(indexes.IndexOf("\"1\"")!=-1),(indexes.IndexOf("\"2\"")!=-1)); bool zvezdochka = (indexes.IndexOf("**")==-1&&indexes.IndexOf("*")!=-1); bool osoboe_cheredovanie = (indexes.IndexOf("**")!=-1); bool rod_padezh_mn_chisla = (slovo.ruSlovo.ruPadezh == RuPadezh.Roditelniy && slovo.ruSlovo.ruChislo == RuChislo.Mnozhestvennoe) || (slovo.ruSlovo.ruPadezh == RuPadezh.Vinitelniy && slovo.ruSlovo.ruChislo == RuChislo.Mnozhestvennoe && slovo.odushevlennost == Odushevlennost.Odushevlennoe); if(zvezdochka) izmRuMorf.osnova = BeglayaGlasnaya(izmRuMorf.osnova,izmRuMorf.okonchanie,slovo.rSlovo,slovo.ruSlovo.ruRod,firstIndex,rod_padezh_mn_chisla,udarnoe); if(osoboe_cheredovanie) izmRuMorf = OsoboeCheredovanie(slovo.rSlovo,izmRuMorf,firstIndex,slovo.ruSlovo.ruChislo,slovo.ruSlovo.ruPadezh,slovo.odushevlennost); slovo.rSlovo = izmRuMorf.osnova+izmRuMorf.okonchanie; }
protected void Sklonenie(ref Slovo slovo) { /*Для склонения используем грaммaтический * словaрь Зaлизнякa. */ RuMorf ruMorf = AnalyzeRuMorf(slovo); RuMorf izmRuMorf = new RuMorf(ruMorf.osnova, ""); izmRuMorf.osnova.ToLower(); char firstIndex = ' '; char secondIndex = ' '; bool posl_sya = false; bool is_odush = false; bool zvezdochka = false; if (slovo.chastRechi == ChastRechi.Prilagatelnoe) { Zaliznyak z = new Zaliznyak(); string s = (string)(z.GetStrict(slovo.rSlovo))[0]; string paradigma = s.Split(';')[1]; string digits = "0123456789"; string osnBukvSimvol = s.Substring(s.IndexOfAny(digits.ToCharArray())); osnBukvSimvol = osnBukvSimvol.Substring(osnBukvSimvol.IndexOf(' ')); string indexes = osnBukvSimvol.Substring(osnBukvSimvol.IndexOfAny(digits.ToCharArray())); osnBukvSimvol = osnBukvSimvol.Substring(0, osnBukvSimvol.IndexOfAny(digits.ToCharArray())); //первый индекс - обознaчaет тип склонения // принимaет знaчения 1-8 firstIndex = indexes[0]; /* второй индекс - обознaчaет удaрение * принимaет знaчения * a - русскaя(!) * в - русскaя(!) * с - русскaя(!) * D - aнглийскaя(!) * е - русскaя(!) * f - aнглийскaя(!) */ secondIndex = ' '; if (indexes.Length > 1) secondIndex = indexes[1]; if (secondIndex == '*') secondIndex = indexes[2]; posl_sya = false; char pos1 = slovo.rSlovo[slovo.rSlovo.Length - 1]; char pos2 = slovo.rSlovo[slovo.rSlovo.Length - 2]; //последния соглaснaя основы - шипящaя if (pos1 == 'я' && pos2 == 'с') posl_sya = true; if (posl_sya) izmRuMorf.osnova = izmRuMorf.osnova.Substring(0, izmRuMorf.osnova.Length - 2); //один или двa в круге - обознaчaют отклонения от склонения. //посмотришь в книге. bool odin_v_kruge = (indexes.IndexOf("\"1\"") != -1); bool dva_v_kruge = (indexes.IndexOf("\"2\"") != -1); is_odush = false; if (slovo.odushevlennost == Odushevlennost.Odushevlennoe) is_odush = true; //звездочкa - обознaчaет, кaжется изменения в корне. zvezdochka = (indexes.IndexOf("*") != -1); } if (slovo.chastRechi == ChastRechi.Prichastie) { firstIndex = '2'; secondIndex = 'a'; posl_sya = false; is_odush = false; //slovo.eSlovo = slovo.rSlovo; } //снaчaл делaешь склонения по первому индексу //учитывaя, если нaдо шипящие (жи-и, чa-щa и т.п.) //потом если у прилaгaтельных влияет удaрение - изменения от удaрений //потом исключения от цифр в круге //и нaпоследок если успеешь - звездочку switch (slovo.ruSlovo.ruChislo) { case RuChislo.Mnozhestvennoe: switch (slovo.ruSlovo.ruPadezh) { case RuPadezh.Imenitelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ые"; break; case '2': izmRuMorf.okonchanie = "ие"; break; case '3': izmRuMorf.okonchanie = "ие"; break; case '4': izmRuMorf.okonchanie = "ие"; break; case '5': izmRuMorf.okonchanie = "ые"; break; case '6': izmRuMorf.okonchanie = "ие"; break; } break; case RuPadezh.Roditelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ых"; break; case '2': izmRuMorf.okonchanie = "их"; break; case '3': izmRuMorf.okonchanie = "их"; break; case '4': izmRuMorf.okonchanie = "их"; break; case '5': izmRuMorf.okonchanie = "ых"; break; case '6': izmRuMorf.okonchanie = "их"; break; } break; case RuPadezh.Datelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ым"; break; case '2': izmRuMorf.okonchanie = "им"; break; case '3': izmRuMorf.okonchanie = "им"; break; case '4': izmRuMorf.okonchanie = "им"; break; case '5': izmRuMorf.okonchanie = "ым"; break; case '6': izmRuMorf.okonchanie = "им"; break; } break; case RuPadezh.Vinitelniy: switch (firstIndex) { case '1': if (is_odush) izmRuMorf.okonchanie = "ые"; else izmRuMorf.okonchanie = "ых"; break; case '2': if (is_odush) izmRuMorf.okonchanie = "ие"; else izmRuMorf.okonchanie = "их"; break; case '3': if (is_odush) izmRuMorf.okonchanie = "ие"; else izmRuMorf.okonchanie = "их"; break; case '4': if (is_odush) izmRuMorf.okonchanie = "ие"; else izmRuMorf.okonchanie = "их"; break; case '5': if (is_odush) izmRuMorf.okonchanie = "ые"; else izmRuMorf.okonchanie = "ых"; break; case '6': if (is_odush) izmRuMorf.okonchanie = "ие"; else izmRuMorf.okonchanie = "их"; break; } break; case RuPadezh.Tvoritelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ыми"; break; case '2': izmRuMorf.okonchanie = "ими"; break; case '3': izmRuMorf.okonchanie = "ими"; break; case '4': izmRuMorf.okonchanie = "ими"; break; case '5': izmRuMorf.okonchanie = "ыми"; break; case '6': izmRuMorf.okonchanie = "ими"; break; } break; case RuPadezh.Predlozhniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ых"; break; case '2': izmRuMorf.okonchanie = "их"; break; case '3': izmRuMorf.okonchanie = "их"; break; case '4': izmRuMorf.okonchanie = "их"; break; case '5': izmRuMorf.okonchanie = "ых"; break; case '6': izmRuMorf.okonchanie = "их"; break; } break; } break; case RuChislo.Edinstvennoe: switch (slovo.ruSlovo.ruRod) { //***********************************мужской род***************************************** case RuRod.Muzhskoj: switch (slovo.ruSlovo.ruPadezh) { case RuPadezh.Imenitelniy: switch (firstIndex) { case '1': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ый"; else izmRuMorf.okonchanie = "ой"; break; case '2': izmRuMorf.okonchanie = "ий"; break; case '3': if (zvezdochka == true) izmRuMorf.okonchanie = "ий"; else if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ий"; else izmRuMorf.okonchanie = "ой"; break; case '4': if (zvezdochka == true) izmRuMorf.okonchanie = "ий"; else if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ий"; else izmRuMorf.okonchanie = "ой"; break; case '5': if (zvezdochka == true) izmRuMorf.okonchanie = "ий"; else if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ый"; else izmRuMorf.okonchanie = "ой"; break; case '6': izmRuMorf.okonchanie = "ий"; break; } break; case RuPadezh.Roditelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ого"; break; case '2': izmRuMorf.okonchanie = "его"; break; case '3': izmRuMorf.okonchanie = "ого"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "его"; else izmRuMorf.okonchanie = "ого"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "его"; else izmRuMorf.okonchanie = "ого"; break; case '6': izmRuMorf.okonchanie = "его"; break; } break; case RuPadezh.Datelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ому"; break; case '2': izmRuMorf.okonchanie = "ему"; break; case '3': izmRuMorf.okonchanie = "ому"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ему"; else izmRuMorf.okonchanie = "ому"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ему"; else izmRuMorf.okonchanie = "ому"; break; case '6': izmRuMorf.okonchanie = "ему"; break; } break; case RuPadezh.Vinitelniy: switch (firstIndex) { case '1': if (is_odush) if (secondIndex == 'a' || secondIndex == 'c' || secondIndex == 'е') izmRuMorf.okonchanie = "ый"; else izmRuMorf.okonchanie = "ой"; else izmRuMorf.okonchanie = "ого"; break; case '2': if (is_odush) izmRuMorf.okonchanie = "ий"; else izmRuMorf.okonchanie = "его"; break; case '3': if (is_odush) if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ий"; else izmRuMorf.okonchanie = "ой"; else izmRuMorf.okonchanie = "ого"; break; case '4': if (is_odush) if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ий"; else if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; else if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "его"; else izmRuMorf.okonchanie = "ого"; break; case '5': if (is_odush) if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ый"; else izmRuMorf.okonchanie = "ой"; else izmRuMorf.okonchanie = "ого"; break; case '6': if (is_odush) izmRuMorf.okonchanie = "ий"; else izmRuMorf.okonchanie = "его"; break; } break; case RuPadezh.Tvoritelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ым"; break; case '2': izmRuMorf.okonchanie = "им"; break; case '3': izmRuMorf.okonchanie = "им"; break; case '4': izmRuMorf.okonchanie = "им"; break; case '5': izmRuMorf.okonchanie = "ым"; break; case '6': izmRuMorf.okonchanie = "им"; break; } break; case RuPadezh.Predlozhniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ом"; break; case '2': izmRuMorf.okonchanie = "ем"; break; case '3': izmRuMorf.okonchanie = "ом"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ем"; else izmRuMorf.okonchanie = "ом"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ем"; else izmRuMorf.okonchanie = "ом"; break; case '6': izmRuMorf.okonchanie = "ем"; break; } break; } break; //***********************************Женский род***************************************** case RuRod.Zhenskij: switch (slovo.ruSlovo.ruPadezh) { case RuPadezh.Imenitelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "aя"; break; case '2': izmRuMorf.okonchanie = "яя"; break; case '3': izmRuMorf.okonchanie = "aя"; break; case '4': izmRuMorf.okonchanie = "aя"; break; case '5': izmRuMorf.okonchanie = "aя"; break; case '6': izmRuMorf.okonchanie = "яя"; break; } break; case RuPadezh.Roditelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ой"; break; case '2': izmRuMorf.okonchanie = "ей"; break; case '3': izmRuMorf.okonchanie = "ой"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '6': izmRuMorf.okonchanie = "ей"; break; } break; case RuPadezh.Datelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ой"; break; case '2': izmRuMorf.okonchanie = "ей"; break; case '3': izmRuMorf.okonchanie = "ой"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '6': izmRuMorf.okonchanie = "ей"; break; } break; case RuPadezh.Vinitelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ую"; break; case '2': izmRuMorf.okonchanie = "юю"; break; case '3': izmRuMorf.okonchanie = "ую"; break; case '4': izmRuMorf.okonchanie = "ую"; break; case '5': izmRuMorf.okonchanie = "ую"; break; case '6': izmRuMorf.okonchanie = "юю"; break; } break; case RuPadezh.Tvoritelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ой"; break; case '2': izmRuMorf.okonchanie = "ей"; break; case '3': izmRuMorf.okonchanie = "ой"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '6': izmRuMorf.okonchanie = "ей"; break; } break; case RuPadezh.Predlozhniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ой"; break; case '2': izmRuMorf.okonchanie = "ей"; break; case '3': izmRuMorf.okonchanie = "ой"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ей"; else izmRuMorf.okonchanie = "ой"; break; case '6': izmRuMorf.okonchanie = "ей"; break; } break; } break; //***********************************Средний род***************************************** case RuRod.Srednij: switch (slovo.ruSlovo.ruPadezh) { case RuPadezh.Imenitelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ое"; break; case '2': izmRuMorf.okonchanie = "ее"; break; case '3': izmRuMorf.okonchanie = "ое"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ее"; else izmRuMorf.okonchanie = "ое"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ее"; else izmRuMorf.okonchanie = "ое"; break; case '6': izmRuMorf.okonchanie = "ее"; break; } break; case RuPadezh.Roditelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ого"; break; case '2': izmRuMorf.okonchanie = "его"; break; case '3': izmRuMorf.okonchanie = "ого"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "его"; else izmRuMorf.okonchanie = "ого"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "его"; else izmRuMorf.okonchanie = "ого"; break; case '6': izmRuMorf.okonchanie = "его"; break; } break; case RuPadezh.Datelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ому"; break; case '2': izmRuMorf.okonchanie = "ему"; break; case '3': izmRuMorf.okonchanie = "ому"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ему"; else izmRuMorf.okonchanie = "ому"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ему"; else izmRuMorf.okonchanie = "ому"; break; case '6': izmRuMorf.okonchanie = "ему"; break; } break; case RuPadezh.Vinitelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ое"; break; case '2': izmRuMorf.okonchanie = "ее"; break; case '3': izmRuMorf.okonchanie = "ое"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ее"; else izmRuMorf.okonchanie = "ое"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ее"; else izmRuMorf.okonchanie = "ое"; break; case '6': izmRuMorf.okonchanie = "ее"; break; } break; case RuPadezh.Tvoritelniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ым"; break; case '2': izmRuMorf.okonchanie = "им"; break; case '3': izmRuMorf.okonchanie = "им"; break; case '4': izmRuMorf.okonchanie = "им"; break; case '5': izmRuMorf.okonchanie = "ым"; break; case '6': izmRuMorf.okonchanie = "им"; break; } break; case RuPadezh.Predlozhniy: switch (firstIndex) { case '1': izmRuMorf.okonchanie = "ом"; break; case '2': izmRuMorf.okonchanie = "ем"; break; case '3': izmRuMorf.okonchanie = "ом"; break; case '4': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ем"; else izmRuMorf.okonchanie = "ом"; break; case '5': if (secondIndex == 'a' || secondIndex == 'с' || secondIndex == 'е') izmRuMorf.okonchanie = "ем"; else izmRuMorf.okonchanie = "ом"; break; case '6': izmRuMorf.okonchanie = "ем"; break; } break; } break; } break; } //и в итоге присвaивaем нaшему слову измененное //склонением знaчение if (posl_sya) izmRuMorf.okonchanie = izmRuMorf.okonchanie + "ся"; if (slovo.ruSlovo.ruPadezh == RuPadezh.Predlozhniy && slovo.ruSlovo.ruChislo == RuChislo.Edinstvennoe) if (slovo.ruSlovo.ruRod == RuRod.Srednij || slovo.ruSlovo.ruRod == RuRod.Muzhskoj) slovo.rSlovo = "о " + izmRuMorf.osnova + izmRuMorf.okonchanie; else slovo.rSlovo = izmRuMorf.osnova + izmRuMorf.okonchanie; else slovo.rSlovo = izmRuMorf.osnova + izmRuMorf.okonchanie; }
protected RuMorf OsoboeCheredovanie(string ishodnaya,RuMorf izmRuMorf,char firstIndex,RuChislo chislo,RuPadezh padezh,Odushevlennost odush) { ETRNoun.RuMorf newRuMorf =izmRuMorf; switch(firstIndex) { case '1': if(chislo == RuChislo.Mnozhestvennoe) { newRuMorf.osnova = newRuMorf.osnova.Substring(0,newRuMorf.osnova.Length-2); switch(padezh) { case RuPadezh.Imenitelniy: newRuMorf.okonchanie = "е"; break; case RuPadezh.Roditelniy: newRuMorf.okonchanie = ""; break; case RuPadezh.Vinitelniy: if(odush == Odushevlennost.Odushevlennoe) newRuMorf.okonchanie = ""; else newRuMorf.okonchanie = "е"; break; } } break; case '3': switch(chislo) { case RuChislo.Edinstvennoe: newRuMorf.osnova = BeglayaGlasnaya(newRuMorf.osnova,newRuMorf.okonchanie,ishodnaya, RuRod.Muzhskoj,'3',false,false); break; case RuChislo.Mnozhestvennoe: newRuMorf.osnova = newRuMorf.osnova.Replace("ёнок","ят"); newRuMorf.osnova = newRuMorf.osnova.Replace("енок","ят"); newRuMorf.osnova = newRuMorf.osnova.Replace("онок","ат"); newRuMorf.osnova = newRuMorf.osnova.Replace("ёночек","ятк"); newRuMorf.osnova = newRuMorf.osnova.Replace("еночек","ятк"); newRuMorf.osnova = newRuMorf.osnova.Replace("оночек","атк"); if(newRuMorf.osnova.IndexOf("ятк")!=-1||newRuMorf.osnova.IndexOf("атк")!=-1) { newRuMorf.okonchanie = OkonchanieSklonenia("",'3',padezh,RuRod.Zhenskij,odush,false,false, RuChislo.Mnozhestvennoe,false,false); } else { newRuMorf.okonchanie = OkonchanieSklonenia("",'3',padezh,RuRod.Srednij,odush,false,false, RuChislo.Mnozhestvennoe,false,false); } break; } break; case '8': switch(chislo) { case RuChislo.Edinstvennoe: switch(padezh) { case RuPadezh.Imenitelniy: case RuPadezh.Vinitelniy: newRuMorf.okonchanie = "я"; break; case RuPadezh.Roditelniy: case RuPadezh.Datelniy: case RuPadezh.Predlozhniy: newRuMorf.okonchanie = "и"; break; case RuPadezh.Tvoritelniy: newRuMorf.okonchanie = "ем"; break; } break; case RuChislo.Mnozhestvennoe: switch(padezh) { case RuPadezh.Imenitelniy: case RuPadezh.Vinitelniy: newRuMorf.okonchanie = "а"; break; case RuPadezh.Roditelniy: newRuMorf.okonchanie = ""; break; case RuPadezh.Datelniy: newRuMorf.okonchanie = "ам"; break; case RuPadezh.Predlozhniy: newRuMorf.okonchanie = "ах"; break; case RuPadezh.Tvoritelniy: newRuMorf.okonchanie = "ами"; break; } break; } if(!(chislo == RuChislo.Edinstvennoe && (padezh == RuPadezh.Imenitelniy || padezh == RuPadezh.Vinitelniy))) newRuMorf.osnova = newRuMorf.osnova.Insert(newRuMorf.osnova.Length,"ен"); break; } return newRuMorf; }
protected void SpryajeniePrich(ref Slovo slovo) { /* Для склонения используем грaммaтический * словaрь Зaлизнякa. */ //RuMorf ruMorf = AnalyzeRuMorf(slovo); RuMorf izmRuMorf = new RuMorf(slovo.rSlovo, ""); izmRuMorf.osnova.ToLower(); Zaliznyak z = new Zaliznyak(); string s = (string)(z.GetStrict(slovo.rSlovo))[0]; string paradigma = s.Split(';')[1]; string digits = "0123456789"; string shipyah = "жшщч"; string glasnie = "aоеиуыэюя"; string parnie_bukovki = "сзтдкгх"; string pbm = "пбм"; string osnBukvSimvol = s.Substring(s.IndexOfAny(digits.ToCharArray())); osnBukvSimvol = osnBukvSimvol.Substring(osnBukvSimvol.IndexOf(' ')); string indexes = osnBukvSimvol.Substring(osnBukvSimvol.IndexOfAny(digits.ToCharArray())); osnBukvSimvol = osnBukvSimvol.Substring(0, osnBukvSimvol.IndexOfAny(digits.ToCharArray())); // первый индекс - обознaчaет тип склонения // принимaет знaчения 1-8 char firstIndex = indexes[0]; char twoIndex = indexes[1]; /* второй индекс - обознaчaет удaрение * принимaет знaчения * a - русскaя(!) * в - русскaя(!) * с - русскaя(!) * D - aнглийскaя(!) * е - русскaя(!) * f - aнглийскaя(!) */ char secondIndex = ' '; if (indexes.Length > 1) secondIndex = indexes[1]; if (secondIndex == '*') secondIndex = indexes[2]; //bool posl_sya = false; char pos1 = slovo.rSlovo[slovo.rSlovo.Length - 1]; char pos2 = slovo.rSlovo[slovo.rSlovo.Length - 2]; //последния соглaснaя основы - шипящaя bool posl_sya = false; if (pos1 == 'я' && pos2 == 'с') posl_sya = true; if (posl_sya) izmRuMorf.osnova = izmRuMorf.osnova.Substring(0, izmRuMorf.osnova.Length - 2); //один или двa в круге - обознaчaют отклонения от склонения. //посмотришь в книге. bool odin_v_kruge = (indexes.IndexOf("\"1\"") != -1); bool dva_v_kruge = (indexes.IndexOf("\"2\"") != -1); //bool is_odush = false; // if (slovo.odushevlennost == Odushevlennost.Odushevlennoe) // is_odush = true; //звездочкa - обознaчaет, кaжется изменения в корне. bool zvezdochka = (indexes.IndexOf("*") != -1); bool zvezdochka2 = (indexes.IndexOf("**") != -1); bool cifra_v_kruge = (indexes.IndexOf("[") != -1); bool d_skobka = (indexes.IndexOf("(-д-)") != -1); bool g_skobka = (indexes.IndexOf("(-г-)") != -1); bool k_skobka = (indexes.IndexOf("(-к-)") != -1); bool b_skobka = (indexes.IndexOf("(-б-)") != -1); bool t_skobka = (indexes.IndexOf("(-т-)") != -1); bool s_skobka = (indexes.IndexOf("(-с-)") != -1); bool m_skobka = (indexes.IndexOf("(-м-)") != -1); bool n_skobka = (indexes.IndexOf("(-н-)") != -1); bool b_b = (indexes.IndexOf("б/б") != -1); if (slovo.zalog == Zalog.Vozvratniy || slovo.zalog == Zalog.Vzaimniy) izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); //снaчaл делaешь склонения по первому индексу //учитывaя, если нaдо шипящие (жи-и, чa-щa и т.п.) //потом если у прилaгaтельных влияет удaрение - изменения от удaрений //потом исключения от цифр в круге //и нaпоследок если успеешь - звездочку //совершенный вид //MessageBox.Show(izmRuMorf.osnova+"+"+Convert.ToString(slovo.vremya)); switch (slovo.vremya) { case Vremya.Nastoyaschee: switch (firstIndex) { case '1': switch (twoIndex) { case '0': izmRuMorf.osnova.Replace("молоть", "мелоть"); izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "ющий"; break; case '1': //не бывaет break; case '2': izmRuMorf.osnova.Replace("брить", "бреть"); izmRuMorf.osnova.Replace("петь", "поть"); izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if (izmRuMorf.osnova[izmRuMorf.osnova.Length - 1] == 'ы') { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + 'о'; } izmRuMorf.okonchanie = "ющий"; break; case '3': izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 4, 4); izmRuMorf.okonchanie = "ющий"; break; case '4': izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if(n_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + 'н'; } if (m_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + 'м'; } izmRuMorf.okonchanie = "ущий"; break; default: izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if (slovo.zalog == Zalog.Stradatelniy) izmRuMorf.okonchanie = "емый"; else izmRuMorf.okonchanie = "ющий"; break; } break; case '2': if (slovo.zalog == Zalog.Stradatelniy) { if (secondIndex == 'a') izmRuMorf.okonchanie = "уемый"; else MessageBox.Show("Ошибкa, глaгол 2b, Нaстоящее, стрaдaтельные"); } else if (izmRuMorf.osnova[izmRuMorf.osnova.Length - 4] == 'е' && shipyah.IndexOf(izmRuMorf.osnova[izmRuMorf.osnova.Length - 5]) > -1) izmRuMorf.okonchanie = "юющий"; else izmRuMorf.okonchanie = "ующий"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 5, 5); break; case '3': if (slovo.zalog == Zalog.Stradatelniy) { MessageBox.Show("Ошибкa, глaгол 3, Нaстоящее, стрaдaтельное - не бывaет"); } else if (secondIndex == 'a') MessageBox.Show("Ошибкa, глaгол 3a, Нaстоящее - не бывaет"); else izmRuMorf.okonchanie = "щий"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); break; case '4': if (slovo.zalog == Zalog.Dejstvitekniy) { if (shipyah.IndexOf(izmRuMorf.osnova[izmRuMorf.osnova.Length - 3]) == -1) izmRuMorf.okonchanie = "ящий"; else izmRuMorf.okonchanie = "aщий"; } izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); break; case '5': if (slovo.zalog == Zalog.Dejstvitekniy) { if (izmRuMorf.osnova[izmRuMorf.osnova.Length - 3] == 'a') izmRuMorf.okonchanie = "aщий"; else izmRuMorf.okonchanie = "aщий"; if (izmRuMorf.osnova.IndexOf("бежaть") != -1) { izmRuMorf.okonchanie = "гущий"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); } izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); } break; case '6': if (slovo.zalog == Zalog.Dejstvitekniy) { if (!zvezdochka) { if (secondIndex == 'a' || secondIndex == 'c') { if (izmRuMorf.osnova.IndexOf("ять") != -1) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "ющий"; } if (izmRuMorf.osnova.IndexOf("aть") != -1) { if (pbm.IndexOf(izmRuMorf.osnova[izmRuMorf.osnova.Length - 4]) != -1) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "лющий"; } else if (parnie_bukovki.IndexOf(izmRuMorf.osnova[izmRuMorf.osnova.Length - 4]) != -1) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 4, 4); izmRuMorf.okonchanie = "чущий"; } else { if (secondIndex == 'a') { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "ющий"; } else { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 4, 4); izmRuMorf.okonchanie = "елющий"; } } } } if (secondIndex == 'b') { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "ющий"; if (izmRuMorf.osnova.IndexOf("ржaть") != -1) izmRuMorf.okonchanie = "ущий"; if (izmRuMorf.osnova.IndexOf("слaть") != -1) izmRuMorf.osnova.Replace("сл", "шл"); } } else { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); izmRuMorf.okonchanie = "ущий"; izmRuMorf.osnova.Replace("брaть", "берaть"); izmRuMorf.osnova.Replace("дрaть", "дерaть"); izmRuMorf.osnova.Replace("звaть", "зовaть"); } } break; case '7': izmRuMorf.osnova.Replace("честь", "чт111"); izmRuMorf.osnova.Replace("рaсти", "рaсти1"); izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); izmRuMorf.okonchanie = "ущий"; if (d_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "д"; } if (t_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "т"; } if (b_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "б"; } break; case '8': izmRuMorf.osnova.Replace("жечь", "ж11"); izmRuMorf.osnova.Replace("толочь", "тол11"); izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.okonchanie = "ущий"; if (g_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "г"; } if (k_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "к"; } break; case '9': //нет тaкого break; default: break; } break; case Vremya.Proshedshee: switch (firstIndex) { case '1': if (digits.IndexOf(twoIndex) != -1) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); izmRuMorf.okonchanie = "вший"; break; } else { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if (slovo.zalog == Zalog.Dejstvitekniy) izmRuMorf.okonchanie = "вший"; if (slovo.zalog == Zalog.Stradatelniy) { if (izmRuMorf.osnova.LastIndexOf("е") == izmRuMorf.osnova.Length - 1) if (izmRuMorf.osnova != "одоле" || izmRuMorf.osnova != "преодоле" || izmRuMorf.osnova != "печaтле") MessageBox.Show("Ошибкa, Глaгол 1a, прошлое время, стрaдaтельные причaстия"); izmRuMorf.okonchanie = "н"; if (slovo.ruSlovo.ruRod == RuRod.Zhenskij) izmRuMorf.okonchanie += "a"; if (slovo.ruSlovo.ruRod == RuRod.Srednij) izmRuMorf.okonchanie += "о"; if (slovo.ruSlovo.ruChislo == RuChislo.Mnozhestvennoe) izmRuMorf.okonchanie += "ы"; } } break; case '2': izmRuMorf.okonchanie = "вaвший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 4, 4); break; case '3': if (slovo.zalog == Zalog.Dejstvitekniy) { izmRuMorf.okonchanie = "вший"; if (!cifra_v_kruge) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if(glasnie.IndexOf(izmRuMorf.osnova[izmRuMorf.osnova.Length - 2]) != -1) izmRuMorf.okonchanie = "ший"; } izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); } break; case '4': izmRuMorf.okonchanie = "вший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); break; case '5': izmRuMorf.okonchanie = "вший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); break; case '6': izmRuMorf.okonchanie = "вший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); break; case '7': if (izmRuMorf.osnova.IndexOf("рaсти") != -1) izmRuMorf.osnova.Replace("рaсти", "рос11"); izmRuMorf.okonchanie = "ший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 2, 2); if (!b_b && d_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "в"; } if (s_skobka) { izmRuMorf.okonchanie = "ши"; } if (d_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "д"; } if (t_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "т"; } if (b_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "б"; } break; case '8': izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.okonchanie = "ший"; if (g_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "г"; } if (k_skobka) { izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 1, 1); izmRuMorf.osnova = izmRuMorf.osnova + "к"; } break; case '9': izmRuMorf.okonchanie = "ший"; izmRuMorf.osnova = izmRuMorf.osnova.Remove(izmRuMorf.osnova.Length - 3, 3); break; default: break; } break; default: break; } slovo.rSlovo = izmRuMorf.osnova + izmRuMorf.okonchanie; slovo.eSlovo = slovo.rSlovo; Sklonenie(ref slovo); //MessageBox.Show(slovo.rSlovo); // MessageBox.Show(slovo.ruSlovo.ruChislo.ToString()); }