public ListDerivation ExpandStep() { //Идем вправо по списку, если: // SymbolDerivation, раскрываем и заменяем если результат ListDerivation, // возвращаем его иначе себя // ListDerivation - возврящаем его // дошли до конца списка - возвращаем верхний список (ParentDerivation) while (mCurrentItemIndex < mList.Count) { ListDerivation lAsListDer = CurrentItem as ListDerivation; if (null != lAsListDer) { mCurrentItemIndex++; return(lAsListDer); } SymbolDerivation lAsSymDer = CurrentItem as SymbolDerivation; if (null != lAsSymDer) { ExpandingSymbol = lAsSymDer.Symbol; //раскрываем и заменяем IDerivation lSymbolResult = Generator.ExpandNonTerminal(lAsSymDer.Symbol); CurrentItem = lSymbolResult; ListDerivation lSymbolResultAsList = lSymbolResult as ListDerivation; //если результат ListDerivation, возвращаем его иначе себя (старый верхний список) return(lSymbolResultAsList ?? this); } mCurrentItemIndex++; } //дошли до конца списка return(ParentDerivation as ListDerivation); //??? }
private string AddObject(object aObject, string aName, string aRootNodeID) { if (aObject == null) { return("null!"); } string type = aObject.GetType().Name; string title = type + " " + aName; string lNodeId; if (typeof(ListDerivation) == aObject.GetType()) { ListDerivation l = aObject as ListDerivation; string s = "\r\n0"; for (int i = 1; i < l.mList.Count; i++) { s += " | " + i.ToString(); } lNodeId = gb.AddNode(title + s); gb.SetBGColor(lNodeId, 255, 255, 0); if (aRootNodeID != null) { gb.AddEdge(aRootNodeID, aName, lNodeId); } for (int i = 0; i < l.mList.Count; i++) { AddObject(l.mList[i], string.Format("[{0}]", i), lNodeId); } return(lNodeId); } else if (typeof(TextDerivation) == aObject.GetType()) { if (aRootNodeID != null) { TextDerivation l = aObject as TextDerivation; string lStr = string.Format("\"{0}\"", l.Text); gb.AddEdge(aRootNodeID, aName, lStr); gb.SetBGColor(lStr, 0, 255, 0); } return(null); } else if (typeof(SymbolDerivation) == aObject.GetType()) { SymbolDerivation l = aObject as SymbolDerivation; gb.AddEdge(aRootNodeID, aName, l.Symbol.Text + " " + type); return(null); } else if (typeof(DictionaryDerivation) == aObject.GetType()) { DictionaryDerivation l = aObject as DictionaryDerivation; String[] keys = l.Keys; title += "\r\n" + string.Join("\r\n", keys); lNodeId = gb.AddNode(title); gb.SetBGColor(lNodeId, 255, 128, 0); if (aRootNodeID != null) { gb.AddEdge(aRootNodeID, aName, lNodeId); } foreach (string lKey in keys) { AddObject(l[lKey], lKey, lNodeId); } return(lNodeId); } //default lNodeId = gb.AddNode(title); return(lNodeId); }
private ListDerivation GenerateIterativeLeftRight(DerivationContext aLContext) { ListDerivation lCurDerivationList = new ListDerivation(true, aLContext); //начало - генерируем первый вывод в цепочке вывода lCurDerivationList.Add(mGrammar.MainSymbol.Accept(aLContext)); bool lDeriving = true; while (lDeriving) { lDeriving = false; //log //TLog.Write("===>" + lCurDerivationList); // fire progress event if (Progress != null && lCurDerivationList != null) { GenerateProgressEventArgs e = new GenerateProgressEventArgs { RootText = lCurDerivationList.ToString(), }; Progress(this, e); } //создаем новый список и переписываем в него lCurDerivationList раскрывая нетерминалы ListDerivation lNewDerivationList = new ListDerivation(true, aLContext); //Просматриваем список на предмет нетерминалов и раскрываем их for (int i = 0; i < lCurDerivationList.mList.Count; i++) { SymbolDerivation lNonTermSym = lCurDerivationList[i] as SymbolDerivation; if (null != lNonTermSym) { //раскрываем нетерминал lDeriving = true; IDerivation lDer = ExpandNonTerminal(lNonTermSym.Symbol); //вставить результат в новый список if (lDer is ListDerivation) { ListDerivation list = (ListDerivation)lDer; foreach (IDerivation ddd in list.mList) { lNewDerivationList.Add(ddd); } } else { lNewDerivationList.Add(lDer); } } else { //скопировать терминал в новый список lNewDerivationList.Add(lCurDerivationList[i]); } //SpecGraphBuilder.RootObject = lNewDerivationList; //Thread.Sleep(500); } lCurDerivationList = lNewDerivationList; } if (Grammar.SpecGraphBuilder != null) { Grammar.SpecGraphBuilder.RootObject = lCurDerivationList; } return(lCurDerivationList); }