예제 #1
0
        /// <summary>
        /// Определяет циклические символы и альтернативы
        /// </summary>
        public void FindCycles()
        {
            // Чистимся
            AllCyclicSymbolOccurs.Clear();
            foreach (NonTerminalCommon curSymbol in AllNonTerminals.Values)
            {
                curSymbol.IsCyclic = false;
            }

            // 1) Первый проход - определяем только циклические символы
            mMainSymbol.Context = new CyclesDetectContext(this);
            mMainSymbol.Context.DerivPath.Add(mMainSymbol.Text);
            mMainSymbol.Context.Visitor = new CyclesDetectVisitor();
            //гр
            //context.BuildingGraph = new tGraph();
            //context.BuildingGraph.addNode(MainSymbol.CounterName);

            mMainSymbol.Accept(mMainSymbol.Context);

            // 2) Теперь от символов маркируем все фразы
            //foreach (NonTerminalCommon cyclicCommon in AllCyclicSymbols)
            //{
            //  foreach (NonTerminal nonTerminal in cyclicCommon.AllOccurences)
            //  {
            //    nonTerminal.Parent.PropagateCycle();
            //  }
            //}

            // 3) Верификация - должна быть хотябы одна нециклическая альтернатива
            DerivationContext  context      = new DerivationContext(this);
            CheckCyclesVisitor checkVisitor = new CheckCyclesVisitor();

            context.Visitor = checkVisitor;
            foreach (Rule rule in Rules.Values)
            {
                rule.RightSide.Accept(context);
            }
            if (!string.IsNullOrEmpty(checkVisitor.Log))
            {
                //Есть ошибки
                MessageBox.Show(checkVisitor.Log);
            }
        }
예제 #2
0
 private static void ExpandPhrase(QuantifiedPhrase aQuantifiedPhrase, DerivationContext aContext,
                                  ListDerivation aList, int aRepeatCount)
 {
     if (aQuantifiedPhrase.Phrase is NonTerminal)
     {
         NonTerminal lThisSym   = (NonTerminal)aQuantifiedPhrase.Phrase;
         NonTerminal lNewSymbol = new NonTerminal(lThisSym);
         //to del but i feel it will be neeeded lNewSymbol.OccurenceInSeq = aRepeatCount;
         aList.Add(lNewSymbol.Accept(aContext));
     }
     else
     {
         aList.Add(aQuantifiedPhrase.Phrase.Accept(aContext));
     }
 }