Склонение по падежам

База знаний

Модераторы: m0p3e, edward_K, Модераторы

Склонение по падежам

Сообщение galover » Чт май 27, 2010 21:38

Накидал интерфейс для склонения предложений, состоящих из существительных (в именительном падеже) и прилагательных. Искал что-то стандартное. Галактический интерфейс склонения фамилий не устроил, так что сел за велосипед. Функционал затачивался в основном под наименования отделов и ЦО, 90% предложений проходят (параметр stopAfterNoun = true). Можно использовать для наименований объектов ремонта и строительства (stopAfterNoun = false). Есть глюки с родами (например "двигатель" и "ночь", заканчиваются мягким знаком, окончания будут разные, но в программе это не учитывается). Может кому пригодится
Код: Выделить всё
// Файл StringUtils.vih

#ifndef __StringUtils_vih__
#define __StringUtils_vih__

#component "Utils"

   // Падежи
   const
      csNominativeCase      = 1; // Именительный падеж (Кто? Что?)
      csGenitiveCase        = 2; // Родительный падеж (Кого? Чего?)
      csDativeCase          = 3; // Дательный (Кому? Чему?)
      csAccusativeCase      = 4; // Винительный (Кого? Что?)
      csInstrumentativeCase = 5; // Творительный (Кем? Чем?)
      csPrepositionCase     = 6; // Предложный (О ком? О чём?)
   end;
   
   // Части речи
   const
      csUnknownWord   = 0;    // Неопределенное
      csNounWord      = 1;    // Существительное
      csAdjectiveWord = 2;    // Прилагательное     
   end;
   
   
   // Тип данных -> слово и часть речи 
   public type tWordWithType = record
      WordStr  : string;
      WordType : byte;
   end;   
   
   public type StringArray = array [1..1] of string;   

   public objInterface IStringUtils;
      public:
         ////////////////////////////////////////////////////////////////////////
         // Склонение слов и предложений, сос`тоящих из существительных и прилагательных
         // _case - падеж (константа)
         // stopAfterNoun - прекратить склонение после того как наткнулись на существительное
         ////////////////////////////////////////////////////////////////////////   
         function ConvertWordToCase(str : string; _case : byte) : tWordWithType;
         function ConvertStatementToCase(str : string; _case : byte; stopAfterNoun : boolean = false) : string;   
   end;

   public vipInterface StringUtils implements IStringUtils; 
#end

// Файл StringUtils.vip
#component "Utils"

interface StringUtils;
   
   type tCaseParam = record
      AdjEnd  : array[1..6] of string;
      NounEnd : array[1..7] of string;
   end;   
   
   var _caseParams : array [1..6] of tCaseParam; // Параметры склонений

   ////////////////////////////////////////////////////////////////////////
   // Склонение слов и предложений, состоящих из существительных и прилагательных
   // _case - падеж (константа)
   // onlyAdjective - склонять только прилагательные
   ////////////////////////////////////////////////////////////////////////   
   private function ConvertWordToCaseInternal(str : string; _case : byte; onlyAdjective : boolean) : tWordWithType;
   {     
      result.WordStr  := str;
      result.WordType := csUnknownWord;
     
      if (_case < csGenitiveCase or _case > csPrepositionCase)     
         exit;
         
      var strLen    : byte;
      var cutLen    : byte;
      var ending    : string;
      var wordType  : byte;     
      var caseParam : tCaseParam;

      str       := Trim(str);
      strLen    := Length(str);

      if (str = '' or strLen < 3) // максимальная длина окончания 2 символа
         exit;
         
      caseParam := _caseParams[_case];     

      // 1-й уровень проверки - на прилагательное     
      wordType := csAdjectiveWord;
      cutLen   := 2;     
      ending   := SubStr(str, Byte(strLen - 1), cutLen);
     
      if (UpCase(str) = 'СТОЛОВАЯ') // Исключения
      {
         wordType  := csNounWord;
      }

      case ending of
         'ой': ending := caseParam.AdjEnd[1];
         'ое': ending := caseParam.AdjEnd[2];
         'ый': ending := caseParam.AdjEnd[3];
         'ий': ending := caseParam.AdjEnd[4];
         'ее': ending := caseParam.AdjEnd[5];
         'ая': ending := caseParam.AdjEnd[6];
         else { ending := ''; wordType := csUnknownWord; }
      end;
      //}

      // 2 уровень проверки - на существительное
      if (wordType = csUnknownWord and (not onlyAdjective))
      {
         wordType := csNounWord;
         
         if (UpCase(str) = 'БЮРО') // Исключения
         {
            cutLen := 0;
            ending := '';     
         }
         else
         {
            cutLen := 1;
            ending := SubStr(str, strLen, cutLen);       
         
            case ending of
               'б', 'в', 'г', 'д', 'ж', 'з', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ':
               {
                  ending := caseParam.NounEnd[1];
                  cutLen := 0;
               }
               'а': ending := caseParam.NounEnd[2];
               'е': ending := caseParam.NounEnd[3];           
               'о': ending := caseParam.NounEnd[4];
               'ы': ending := caseParam.NounEnd[5];
               'я': ending := caseParam.NounEnd[6];
               'ь': ending := caseParam.NounEnd[7]; // Здесь ошибка из-за рода: модель и двигатель
               else { ending := ''; wordType := csUnknownWord; }
            end;
         }
      }

      if (wordType <> csUnknownWord)
      {
         result.WordStr  := SubStr(str, 1, Byte(strLen - cutLen)) + ending;
         result.WordType := wordType;
      }
     
      result := result;
   }
   
   ////////////////////////////////////////////////////////////////////////
   // Склонить слово
   // Слово должно быть в именительном падеже и единственном числе
   ////////////////////////////////////////////////////////////////////////     
   public function IStringUtils.ConvertWordToCase(str : string; _case : byte) : tWordWithType;
   {
      result := ConvertWordToCaseInternal(str, _case, false);
   }

   public function IStringUtils.ConvertStatementToCase(str : string; _case : byte; stopAfterNoun : boolean = false) : string;
   {
      if (_case < csGenitiveCase or _case > csPrepositionCase)
      {
         result := str;
         exit;
      }
     
      result     := '';
     
      var i : byte;
     
      var strLen : word;
      strLen := Length(str);
     
      var curWordLen : byte;
      curWordLen := 0;
     
      var wasNoun : boolean; // Признак того, что нашлось существительное   
      wasNoun := false;

      for (i := 1; i <= strLen; i++)
      {
         var curChar  : char;
         var needCut  : boolean; // Признак того, что необходимо выделять слово для преобразования
         var wasDelim : boolean;
         var cutPos   : byte;

         curChar  := str[i];
         needCut  := false;         
         
         if (curChar = ' ' or curChar = ',') // Проверка на разделитель слов в предложении
         {
            if (curWordLen > 0)
            {
               needCut  := true;
               cutPos   := i - curWordLen;
               wasDelim := true;
            }
            else result += curChar;
         }
         else
         {
            curWordLen++;
           
            if (i = strLen) // Дошли до конца выражения
            {
               needCut := true;
               cutPos  := i - curWordLen + 1;
               wasDelim := false;
            }
         }
         
         if (needCut)
         {
            var wordWithType : tWordWithType;
            wordWithType := ConvertWordToCaseInternal(SubStr(str, cutPos, curWordLen), _case, wasNoun);
           
            result += wordWithType.WordStr + if(wasDelim, curChar, '');
            curWordLen := 0;
           
            if (wordWithType.WordType = csNounWord and i <> strLen)
            {
               wasNoun := true;
               
               if (stopAfterNoun)
               {
                  result += SubStr(str, i + 1, strLen - i);
                  break;
               }
            }
         }
      }
   }   
   
   handleEvent
      cmOnVipLoad:
      {
         /*
         Окончания прилагательных   
         
         [1] 'ой' // ДеловОЙ
         [2] 'ое' // КрасивОЕ
         [3] 'ый' // КрасивЫЙ
         [4] 'ий' // ТехническИЙ
         [5] 'ее' // ОбщЕЕ
         [6] 'ая' // СчастливАЯ
         
         Окончания существительных
         [1] 'б', 'в', 'г', 'д', 'ж', 'з', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ' // Отдел
         [2] 'а' // РаботА
         [3] 'е' // ПолЕ           
         [4] 'о' // ОкнО
         [5] 'ы' // НасосЫ
         [6] 'я' // НянЯ
         [7] 'ь' // Модель, двигатель
         */         
         
         var caseParam : tCaseParam;
         ////////////////////////////////////////////////////////////////////////
         // Именительный падеж (кто, что)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         _caseParams[1] := caseParam;

         ////////////////////////////////////////////////////////////////////////
         // Родительный падеж (кого, чего)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         
         caseParam.AdjEnd[1] := 'ого';
         caseParam.AdjEnd[2] := 'ого';
         caseParam.AdjEnd[3] := 'ого';
         caseParam.AdjEnd[4] := 'ого';
         caseParam.AdjEnd[5] := 'его';
         caseParam.AdjEnd[6] := 'ой';       

         caseParam.NounEnd[1] := 'а';
         caseParam.NounEnd[2] := 'ы';
         caseParam.NounEnd[3] := 'я';
         caseParam.NounEnd[4] := 'а';
         caseParam.NounEnd[5] := 'ов';
         caseParam.NounEnd[6] := 'и';
         caseParam.NounEnd[7] := 'и';

         _caseParams[2] := caseParam;         
         
         ////////////////////////////////////////////////////////////////////////
         // Дательный падеж (кому, чему)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         
         caseParam.AdjEnd[1] := 'ому';
         caseParam.AdjEnd[2] := 'ому';
         caseParam.AdjEnd[3] := 'ому';
         caseParam.AdjEnd[4] := 'ому';
         caseParam.AdjEnd[5] := 'ему';
         caseParam.AdjEnd[6] := 'ой';

         caseParam.NounEnd[1] := 'у';
         caseParam.NounEnd[2] := 'е';
         caseParam.NounEnd[3] := 'ю';
         caseParam.NounEnd[4] := 'у';
         caseParam.NounEnd[5] := 'ам';
         caseParam.NounEnd[6] := 'е';
         caseParam.NounEnd[7] := 'и';

         _caseParams[3] := caseParam;
         
         ////////////////////////////////////////////////////////////////////////
         // Винительный падеж (кого, что)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         
         caseParam.AdjEnd[1] := 'ого';
         caseParam.AdjEnd[2] := 'ое';
         caseParam.AdjEnd[3] := 'ого';
         caseParam.AdjEnd[4] := 'ий';
         caseParam.AdjEnd[5] := 'ее';
         caseParam.AdjEnd[6] := 'ую';

         caseParam.NounEnd[1] := '';
         caseParam.NounEnd[2] := 'у';
         caseParam.NounEnd[3] := 'е';
         caseParam.NounEnd[4] := 'о';
         caseParam.NounEnd[5] := 'ы';
         caseParam.NounEnd[6] := 'ю';
         caseParam.NounEnd[7] := 'ь';

         _caseParams[4] := caseParam;
         
         ////////////////////////////////////////////////////////////////////////
         // Творительный падеж (кем, чем)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         
         caseParam.AdjEnd[1] := 'ым';
         caseParam.AdjEnd[2] := 'ым';
         caseParam.AdjEnd[3] := 'ым';
         caseParam.AdjEnd[4] := 'им';
         caseParam.AdjEnd[5] := 'им';
         caseParam.AdjEnd[6] := 'ой';

         caseParam.NounEnd[1] := 'ом';
         caseParam.NounEnd[2] := 'ой';
         caseParam.NounEnd[3] := 'ем';
         caseParam.NounEnd[4] := 'ом';
         caseParam.NounEnd[5] := 'ами';
         caseParam.NounEnd[6] := 'ей';
         caseParam.NounEnd[7] := 'ью';

         _caseParams[5] := caseParam;
         
         ////////////////////////////////////////////////////////////////////////
         // Предложный падеж (о ком, о чем)
         ////////////////////////////////////////////////////////////////////////
         ClearAdvRecord(caseParam);
         
         caseParam.AdjEnd[1] := 'ом';
         caseParam.AdjEnd[2] := 'ом';
         caseParam.AdjEnd[3] := 'ом';
         caseParam.AdjEnd[4] := 'ом';
         caseParam.AdjEnd[5] := 'ем';
         caseParam.AdjEnd[6] := 'ой';

         caseParam.NounEnd[1] := 'е';
         caseParam.NounEnd[2] := 'е';
         caseParam.NounEnd[3] := 'е';
         caseParam.NounEnd[4] := 'е';
         caseParam.NounEnd[5] := 'ах';
         caseParam.NounEnd[6] := 'е';
         caseParam.NounEnd[7] := 'и';

         _caseParams[6] := caseParam;
      }
   end;
end.

// Использование Test.vip
#component "Test"

interface TestCase;
   
   create view
   as select
      ObjRem.Name,
      FpCO.Name
   from
      ObjRem,
      FpCO;

   handleEvent
      cmInit:
      {
         var strUtils : Utils::IStringUtils;     
         LoadVipRef(strUtils, 'Utils::StringUtils');
         
         _loop ObjRem // FpCO
         {
            var str : string;
            str := ObjRem.Name;  // FpCO.Name
           
            var needStop : boolean;
            needStop := false; // Для ObjRem = false для FpCO = true

            LogStrToFile('c:\res.log', str +
                                       Chr(13) +
                                       strUtils.ConvertStatementToCase(str, csGenitiveCase, needStop) +
                                       Chr(13) +
                                       strUtils.ConvertStatementToCase(str, csDativeCase, needStop) +
                                       Chr(13) +
                                       strUtils.ConvertStatementToCase(str, csAccusativeCase, needStop) +
                                       Chr(13) +
                                       strUtils.ConvertStatementToCase(str, csInstrumentativeCase, needStop) +
                                       Chr(13) +
                                       strUtils.ConvertStatementToCase(str, csPrepositionCase, needStop) +
                                       Chr(13));
         }         
         
         ProcessText('c:\res.log', vfRunModal or vfNewTitle or vfToErase or vfMacroSize or vfEscable, 'Отчет');         
      }
   end;
end.


Результат
Объект ремонта
----
Система контроля вибрации
Системы контроля вибрации
Системе контроля вибрации
Систему контроля вибрации
Системой контроля вибрации
Системе контроля вибрации
---

Центр ответственности
---
Служба организации общественного питания
Службы организации общественного питания
Службе организации общественного питания
Службу организации общественного питания
Службой организации общественного питания
Службе организации общественного питания
---
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

Сообщение LaaLaa » Пт май 28, 2010 08:41

В свое время тоже интересовался морфологическими модулями.

Вот интересное предложение "Морфологическая библиотека для разработчиков" Компания «Информатик»
http://www.informatic.ru/catalogue/developers/

Там есть функция Синтез всех форм заданного слова. Модуль выдает все формы заданного слова, если оно находится в основном словаре или пополняемом морфологическом словаре пользователя неограниченного объема.

Библиотека позволяет провести точный анализ слов, находящихся в словаре ОРФО. В русском словаре общей лексики содержится около 180 тысяч словарных статей (лексем), в специализированных словарях еще около 60 тысяч, дающих вместе более 4-х миллионов словоформ. База для украинского языка содержит около 130 тысяч лексем, для английского - около 115 тысяч, для немецкого – 100 тыс., итальянского – 80 тыс., французского - 45 тыс., испанского - 48 тыс., португальского - 50 тыс., португальского (Бразилия) - 43 тыс. лексем. Для неизвестных слов библиотека с высокой степенью достоверности помогает сделать предсказание грамматических характеристик и парадигмы на основе комплекса правил словоизменения.

Продукт поставляется в виде динамической библиотеки (*.dll) для Windows.

Потестировать работу морфологических модулей on-line можно здесь
http://www.orfo.ru/stemmer/Default.aspx
инженеГр-программист
Аватара пользователя
LaaLaa
Местный житель
 
Сообщения: 959
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: НПО ТопСофт
Reputation point: 65

Сообщение galover » Пт май 28, 2010 10:42

LaaLaa
Посмотрел, там по словам склонения, я же предложения склоняю. Если брать например "Отдел главного механика", то тогда для дательного падежа на выходе по идее получим: "ОтделУ главнОМУ механикУ". Интерфейс что я привел выдаст: "ОтделУ главнОГО механикА".
А вообще модуль склонения выражений в Галактике необходим, очень часто в отчетах идут выражения: "Начальника такого-то отдела", "Итого по такому-то отделу", "В таком-то отделе выявлено".
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

Сообщение galover » Пт май 28, 2010 13:50

еще вот такое нашел http://www.delphikingdom.com/asp/viewitem.asp?catalogid=412 Прикрутите уже к Галактике склонения!
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

Сообщение LaaLaa » Пт май 28, 2010 14:22

А эта DLL с закрытым кодом?
инженеГр-программист
Аватара пользователя
LaaLaa
Местный житель
 
Сообщения: 959
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: НПО ТопСофт
Reputation point: 65

Сообщение galover » Пт май 28, 2010 14:24

там внизу ссылки на исходники
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

Сообщение LaaLaa » Сб май 29, 2010 14:38

не нашел padeg.pll закрыт код.
инженеГр-программист
Аватара пользователя
LaaLaa
Местный житель
 
Сообщения: 959
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: НПО ТопСофт
Reputation point: 65

Сообщение galover » Пн май 31, 2010 11:47

да, кажись она без исходников. Это принципиально?
вот еще, хвалят http://morpher.ru/Demo.aspx
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

Re: Склонение по падежам

Сообщение Vik » Ср апр 20, 2011 19:19

Пригодилось, плюсую!
Vik
Местный житель
 
Сообщения: 370
Зарегистрирован: Чт сен 28, 2006 15:43
Откуда: Санкт-Петербург
Reputation point: 26

Re: Склонение по падежам

Сообщение n0where » Ср ноя 29, 2017 15:45

Добрый день.
Ни у кого не получилось запустить склонение в Галактике?

Попытался сделать через Padeg.dll

Вылетает Галактика
Код: Выделить всё
function GetFIOtoPadeg(pFIO: string, nPadeg: LongInt, var pResult: string var nLen: LongInt): String; external 'Padeg.dll#GetFIOPadegFSAS';

и так
Код: Выделить всё
function GetFIOtoPadeg(pFIO: string, nPadeg: LongInt): String; external 'Padeg.dll#GetFIOPadegFSAS';


Есть какие нибудь решения?

Решил через ОЛЕ. Но может есть вариант прикрутить через dll?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
n0where
Местный житель
 
Сообщения: 497
Зарегистрирован: Чт дек 30, 2010 09:16
Reputation point: 11

Re: Склонение по падежам

Сообщение edward_K » Ср ноя 29, 2017 21:14

вообще если dll паскалевская/делфи
то так
Function IntervalYears (Date,Date) : Integer; external 'G_STAFF.DLL';
Я лично юзаю библиотеку на базе кадровской - ошибок не так много.
вот кусок из нее
Код: Выделить всё
// склонение
create view vodecl
var w_fio:string;
    wc_FIOExceptions:comp;
    ww_Fio_Prev :string;
     odecl_NCase: word;
    _Type :word // 0 - абитуриенты, 4 - склонение фио
as select persons.fio
from persons, Catalogs
where ((
  'С' == persons.isemployee
and w_fio==persons.fio
));
var
odecl : declension ; // склонение фио
odecl_i:longint ;
logfile_odecl: string;


//=======================================
Procedure Odecl_logwrite(const w:string);
//=======================================
{
#IFDEF _ODECL_LOG_
logstrtofile(logfile_odecl,w)
#ENDIF
}

//=======================================
Function My_Sclonenie(odecl_w :string ;odecl_NCase: word; cRec : comp=0 ): string ;
//=======================================
var
  odecl_w1,odecl_w2,odecl_w3,odecl_w3_def:string ;
  wkl_check_first : boolean ;
  length_obr :longint;
  wTable: word;
{
//1 именительный
//2 родительный
//3 дательный  - кому чему
//+10  до первого существительного
//+20  фио работника

  odecl_w:=replace(odecl_w,'  ',' ')
#IFDEF _ODECL_LOG_
   Odecl_logwrite('My_Sclonenie Падеж '+string(odecl_NCase)+', строка='+odecl_w)
#END
  odecl_w1:=''
  odecl_i:=0
  odecl_w2:='';
  if odecl_NCase>20
  { if pos('.',odecl_w)>0
     odecl_NCase:=odecl_NCase-20;
  }
  if odecl_NCase>20 //ФИО
  { wTable:=odecl_NCase div 10;
    odecl_NCase:=odecl_NCase mod 10 ;
   
    vodecl.w_fio:=odecl_w
    //if wTable=2
    if cRec=0
    { if  wTable=2
      { if vodecl.getfirst persons=0
        { cRec   :=vodecl.Persons.NRec;
          odecl_w:=vodecl.Persons.Fio
        }
      }
    } //if cRec=0
    if cRec>0   
    {   
        Result:=Odecl.FIODeclension(cRec, odecl_w, odecl_NCase);
        if Trim(REsult)<>''
        {  Exit;
        }
    }
    My_Sclonenie:=Odecl.FIODeclension(0, odecl_w, odecl_NCase);
    exit;
  }
  if odecl_NCase>10
  { odecl_NCase:=odecl_NCase mod 10 ;
    Odecl_logwrite(' ищем первое существительное')
    wkl_check_first:=true ;
  }
  else
  { wkl_check_first:=false ;
  } //
  length_obr:=0;
  do {
    odecl_i:=odecl_i+1
    if odecl_i>20 then break ;
    odecl_w3:=ExtractDelimitedWord(odecl_w,odecl_i,' ')
    length_obr:=length_obr+length(odecl_w3)+1;
    Odecl_logwrite('итерация '+string(odecl_i)+', подстрока='+odecl_w3)
    if pos('.',odecl_w3)>0 then
    { odecl_w1:=odecl_w1+' '+odecl_w3
      continue;
    }
    if pos('-',odecl_w3)>0
    { odecl_w3_def:=substr(odecl_w3,1,pos('-',odecl_w3))
      odecl_w3    :=substr(odecl_w3,pos('-',odecl_w3)+1,200)
      Odecl_logwrite(' odecl_w3_def='+odecl_w3_def)
    }
    else
    { odecl_w3_def:=''
    }
    odecl_w3:=trim(odecl_w3)
    odecl_w2:='';
    if
    //substr(odecl_w3,length(odecl_w3)-1,2)<>'ла'    and
    substr(odecl_w3,length(odecl_w3)-1,2)<>'ра'
    //and substr(odecl_w3,length(odecl_w3)-1,2)<>'ой'
    //and substr(odecl_w3,length(odecl_w3)-1,2)<>'ии'
    and substr(odecl_w3,length(odecl_w3)-2,3)<>'ого'
    and substr(odecl_w3,length(odecl_w3)-1,2)<>'вы'
    and substr(odecl_w3,length(odecl_w3)-1,2)<>'га'
    and substr(odecl_w3,2,2)<>upcase(substr(odecl_w3,2,2)) // исключаем абревиатуру
    {  //http://polyidioms.narod.ru/index/sklonenie_prilagatelnykh/0-216
       if substr(odecl_w3,length(odecl_w3)-1,2)='ое'
       { case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ого';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ому';
          4:{} //=1
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ым';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ом';
          end;
       }
       else
       if substr(odecl_w3,length(odecl_w3)-1,2)='ые'
       { case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ых';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ым';
          4:{} //=1
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ыми';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ых';
          end;
       }
       else
       if substr(odecl_w3,length(odecl_w3)-1,2)='ее'
       { case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'его';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ему';
          4:{} //=1
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'им';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ем';
          end;
       }
       else
       if substr(odecl_w3,length(odecl_w3)-1,2)='ие'
       { // если прилагательное
         /* нн в конце что ли поискать :(, но летние
         case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'их';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'им';
          4:{} //=1
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ими';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'их';
          end;
         */
         case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ия';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ию';
          4:{} //=1
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ем';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ии';
          end;
       }
       else
       if substr(odecl_w3,length(odecl_w3)-2,3)='шая'
       { case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ей';
          3: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ей';
          4: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ую';
          5: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ей';
          6: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-2)+'ой';
          end;
       }
       else
        odecl_w2:= odecl.SurNameDeclension(odecl_w3,0,odecl_NCase,1)
      if odecl_w2=odecl_w3
      { if substr(odecl_w3,length(odecl_w3),1)='ь'
        { case odecl_NCase of
          2: odecl_w2:= substr(odecl_w3,1,length(odecl_w3)-1)+'и'
          end;
        }
      } 
      Odecl_logwrite(' склоненное='+odecl_w2)
    }
    else
      odecl_w2:=odecl_w3
    odecl_w1:=odecl_w1+odecl_w3_def+odecl_w2+' '
    Odecl_logwrite(' строка ='+odecl_w1)
    if odecl_i<=2  and wkl_check_first
    {
      if (pos(locase(substr(odecl_w3,length(odecl_w3),1)),'аеийояыюэ') = 0 //АЕИЙОЯЫЮЭ
      and odecl_w3<>'школа' //and substr(odecl_w3,length(odecl_w3)-1,2)<>'ла' 
      )
      or (  // substr(odecl_w3,length(odecl_w3)-1,2)='ла' 
           //and
         substr(odecl_w3,length(odecl_w3)-1,2)='ря'  // утеря
         )
      { //odecl_w1:=odecl_w1+substr(odecl_w,length(odecl_w3)+2,100) ;
        odecl_w1:=odecl_w1+substr(odecl_w,length_obr+1,100) ;
        Odecl_logwrite(' нашли существительное='+odecl_w1)
        break ;
      } 
    }
  } while odecl_w2<>''
  odecl_w1:=replace(odecl_w1,'щом','щем');
  My_Sclonenie:=trim(odecl_w1)
}
edward_K
Заслуженный деятель интернет-сообщества
 
Сообщения: 4974
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: SPB galaxy spb
Reputation point: 97


Вернуться в Опыт

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1