public override IDerivation VisitInternal(AlternativeSet aAlternativeSet, DerivationContext aContext)
 {
     if (!Twig.IsPassed)
     {
         //Создаем извлекающий символы визитор один раз
         if (null == mExtrSymContext)
         {
             mExtrSymContext         = new ExtractNotTerminalsContext(aContext.Grammar);
             mExtrSymContext.Visitor = new VisitorExtractNTSymbols();
         }
         //Формируем список альтернатив, содержащих желаемый символ
         AlternativeSet lGoodAlts = new AlternativeSet(aContext.Grammar);
         foreach (IPhrase lPhr in aAlternativeSet.Phrases)
         {
             mExtrSymContext.NotTerminals.Clear();
             lPhr.Accept(mExtrSymContext);
             if (mExtrSymContext.NotTerminals.Contains(Twig.WaitingSymbol))
             {
                 lGoodAlts.Phrases.Add(lPhr);
             }
         }
         if (lGoodAlts.Count > 0)
         {
             int i = mRnd.Next(lGoodAlts.Count);
             return(lGoodAlts.GetAlternative(aContext, i));
         }
     }
     return(base.VisitInternal(aAlternativeSet, aContext));
 }
        public override IDerivation VisitInternal(AlternativeSet aAlternativeSet, DerivationContext aContext)
        {
            int i = 0;
            NormalDistribution lNormRnd = new NormalDistribution(0, aAlternativeSet.Count / 2);

            i = lNormRnd.intND();
            if (i < 0 || i >= aAlternativeSet.Count)
            {
                i = 0;
            }
            return(aAlternativeSet.GetAlternative(aContext, i));
        }
        public override IDerivation VisitInternal(AlternativeSet aAlternativeSet, DerivationContext aContext)
        {
            //1. Взять контекстный счетчик
            //1.1 Найти в словаре, если нет, создать
            Counter lCounter =
                Generator.CounterDictionary.FindOrAddCounter(
                    aContext.DervPathWithOccurAsString + "__" + aContext.ExpandingRuleSymbol.CounterName, aAlternativeSet.Count);
            bool stopGen = aContext.Generator.StopGenerate;

            if (aContext.Generator.Options.AlternativeAlg != AlternativeSelectAlg.Enum)
            {
                aContext.Generator.StopGenerate = false;
            }
            IDerivation lResult = aAlternativeSet.GetAlternative(aContext, lCounter.Value);

            aContext.Generator.StopGenerate = stopGen;
            return(lResult);
        }
        public override IDerivation VisitInternal(AlternativeSet aAlternativeSet, DerivationContext aContext)
        {
            int i = mRnd.Next(aAlternativeSet.Count);

            return(aAlternativeSet.GetAlternative(aContext, i));
        }