예제 #1
0
 private void RemoveChain(Chain chain)
 {
     if (Chains.Any(x => x.CurrentLocationHead == chain.CurrentLocationHead))
     {
         Chains.Dequeue();
     }
 }
예제 #2
0
파일: Rule.cs 프로젝트: apodavalov/FLaG
        public Rule(IEnumerable <Chain> chains, NonTerminalSymbol target)
        {
            if (chains == null)
            {
                throw new ArgumentNullException(nameof(chains));
            }

            if (target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }

            Chains = chains.ToSortedSet().AsReadOnly();

            if (!Chains.Any())
            {
                throw new ArgumentException("Rule must contain at least one chain.");
            }

            if (Chains.AnyNull())
            {
                throw new ArgumentException("At least one null chain was found.");
            }

            Alphabet = Chains.SelectMany(chain => chain.Alphabet).ToSortedSet().AsReadOnly();
            Target   = target;
            ISet <NonTerminalSymbol> nonTerminals = Chains.SelectMany(chain => chain.NonTerminals).ToSortedSet();

            nonTerminals.Add(Target);
            NonTerminals = nonTerminals.AsReadOnly();
        }
예제 #3
0
        /// <summary>
        ///  Condition of adding new chain in queue
        /// </summary>
        /// <returns>Return true if we can/should add new chain </returns>
        private bool CheckToAdd()
        {
            if (!Chains.Any())
            {
                AddChain(new Chain());
            }
            var lastChain = Chains.Last();

            return(lastChain.CurrentLocationHead - lastChain.WholeLenghtOfChain > 0);
        }