Пример #1
0
 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); //???
 }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }