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