コード例 #1
0
 /// <summary>
 /// Получение вопросительного слова из подпредложения
 /// </summary>
 /// <param name="subSentence">подпредложение</param>
 /// <returns>вопросительное слово</returns>
 private Entity GetQuestionWord(SubSentence subSentence)
 {
     #region [.defense.]
     if (subSentence == null)
     {
         throw new ArgumentNullException("subSentence");
     }
     #endregion
     Entity       result = null;
     UnitTextBase unit   = subSentence.Units.FirstOrDefault(_ => !_.IsEmptyText());
     if ((unit != null) && unit.IsEntity)
     {
         Entity entity = (Entity)unit;
         if (entity.IsType(EntityType.Pretext))
         {
             unit = unit.GetNonEmptyNext();
             if (unit.IsEntity)
             {
                 entity = (Entity)unit;
             }
             else
             {
                 entity = null;
             }
         }
         if ((entity != null) && IsQuestionWord(entity))
         {
             result = entity;
         }
     }
     return(result);
 }
コード例 #2
0
        /// <summary>
        /// Проверка, что между двумя юнитами есть однородный союз
        /// </summary>
        /// <param name="begin">начало интервала</param>
        /// <param name="end">конец интервала</param>
        /// <returns>результат проверки</returns>
        private bool IsHomogeneousConjunctionBetween(UnitTextBase begin, UnitTextBase end)
        {
            UnitTextBase current = begin;

            while ((current != null) && (current != end))
            {
                if (DictionaryResource.IsHomogeneousConjunction(current.Text))
                {
                    return(true);
                }
                current = current.GetNonEmptyNext();
            }
            return(false);
        }
コード例 #3
0
 /// <summary>
 /// Проверка, что заданный юнит является разделителем подпредложений
 /// </summary>
 /// <param name="unit">юнит</param>
 /// <returns>результат проверки</returns>
 private bool IsSubSentenceSeparator(UnitTextBase unit)
 {
     if (unit.IsSeparator(c_subSentenceSeparators))
     {
         UnitTextBase previous = unit.GetNonEmptyPrevious();
         UnitTextBase next     = unit.GetNonEmptyNext();
         if (IsNumericWithoutSeparator(previous, unit.Text) && IsNumericWithoutSeparator(next, unit.Text))
         {
             return(false);
         }
         return(true);
     }
     return(false);
 }
コード例 #4
0
        /// <summary>
        /// Создание нового подпредложения
        /// </summary>
        /// <param name="last">последний юнит текущего подпредложения</param>
        public void CreateNewSubSentence(UnitTextBase last, bool isStrongPosition = false)
        {
            var separateUnit = isStrongPosition ? GetNextNearUnitSkipEmpty(last) : last.GetNonEmptyNext();

            CurrentSubSentence.SubSentence.SetSubSentenceUnits(CurrentSubSentence.StartUnit, separateUnit);
            _subSentenceInfoList.Add(CurrentSubSentence);

            if (separateUnit != null)
            {
                CurrentSubSentence = new SubSentenceInfo(separateUnit, separateUnit.PositionInfo.Start);
            }
            else
            {
                CurrentSubSentence = null;
            }
        }
コード例 #5
0
        /// <summary>
        /// Проверка, что текущее подпредложение должно быть частью предыдущего подпредложения
        /// </summary>
        /// <param name="previous">предыдущее подпредложение</param>
        /// <param name="lastAdded">последнее добавленное подпредложение</param>
        /// <returns>результат проверки</returns>
        private bool IsCurrentPartOfPrevious(SubSentenceInfo previous, SubSentenceInfo lastAdded)
        {
            if ((previous != null) && !CurrentSubSentence.IsExistSubject())
            {
                bool isPossiblePart = true;
                if (previous == lastAdded)
                {
                    UnitTextBase firstUnit = CurrentSubSentence.SubSentence.Units.FirstOrDefault(_ => !_.IsEmptyText());
                    if ((firstUnit != null) && !DictionaryResource.IsHomogeneousConjunction(firstUnit.Text))
                    /// подпредложения не будут соединены
                    {
                        isPossiblePart = false;

                        UnitTextBase secondUnit = firstUnit.GetNonEmptyNext();
                        if (IsAnyType(previous.SubSentence, SubSentenceType.Subordinate) && !(CurrentSubSentence.IsContainConjunction ||
                                                                                              (firstUnit.IsSeparator(",") && (secondUnit != null) && DictionaryResource.IsHomogeneousConjunction(secondUnit.Text))))
                        /// не пытаемся восстановить подлежащее
                        {
                            return(false);
                        }
                    }
                }

                if (IsAnyType(previous.SubSentence, SubSentenceType.Default, SubSentenceType.Subordinate))
                {
                    if (IsCurrentSubject(previous.SubSentence.Subject))
                    {
                        if (CurrentSubSentence.IsContainConjunction || (CurrentSubSentence.IsExistVerb() && previous.IsExistVerb()))
                        {
                            CurrentSubSentence.SubSentence.set_SubjectSubSentence(previous.SubSentence);
                        }
                        else
                        {
                            return(isPossiblePart);
                        }
                    }
                }
                else if (!CurrentSubSentence.IsContainConjunction)
                {
                    return(isPossiblePart && IsCurrentPartOfPrevious(previous));
                }
            }
            return(false);
        }