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)); }