/// <summary>
        /// Операция свёртки - выделение правила из стека и проверка его на валидность, после чего добавление списка правил правилом, которму
        /// соответствует выделенный из стека набор символов.
        /// </summary>
        private void MakeRollingUp()
        {
            //Logger.Debug("--Rolling up started!");
            List <string> rule = new List <string>();

            string stackLexPost = SkipToNextTermSymb(rule);

            rule.Add(stackLexPost);
            //Logger.Info("--Added first VT to rule-set: {0}\n", stackLexPost);

            string stackLexPre = SkipToNextTermSymb(rule);

            char?move = movingMatrix.GetMove(stackLexPre, stackLexPost);

            if (move.Equals('='))
            {
                while (move.Equals('='))
                {
                    rule.Add(stackLexPre);
                    stackLexPost = stackLexPre;
                    stackLexPre  = SkipToNextTermSymb(rule);
                    move         = movingMatrix.GetMove(stackLexPre, stackLexPost);
                }
            }

            //Logger.Info("--Unused symb backed to stack: {0}\n", stackLexPre);
            stack.Push(stackLexPre);

            rule.Reverse();

            //Logger.Info("--Builded rule: {0}\n", string.Join(" ", rule.ToArray()));

            int numOfRule = rules.GetNumberOfRule(rule.ToArray());

            if (numOfRule == -1)
            {
                throw new Exception(
                          "Нарушение синтаксиса языка: [ " + string.Join(" ", rule.ToArray()) + " ] - подобной конструкции не существует в языке!");
            }

            usedRulesList.Add(numOfRule);
            stack.Push(SpecialSymbs.NOT_TERMINAL_SYMB);
        }
        static void SymbolsStackTest()
        {
            SymbolsStack s = new SymbolsStack();

            string[] strs = { "1", "2", "3", "4", "5" };

            s.Push(strs[0]);
            s.Push(strs[1]);
            Debug.Assert(s.Lenght == 2);

            string poped = s.Pop();

            Debug.Assert(poped.Equals(strs[1]));
            Debug.Assert(s.Lenght == 1);

            s.Push(strs[1]);
            s.Push(strs[2]);
            Debug.Assert(s.Lenght == 3);
            string getted = s.GetFirstTerminalSymb();

            Debug.Assert(s.Lenght == 3);
            Debug.Assert(getted.Equals(strs[2]));

            s.Push(SpecialSymbs.NOT_TERMINAL_SYMB);
            Debug.Assert(s.Lenght == 4);
            getted = s.GetFirstTerminalSymb();
            Debug.Assert(s.Lenght == 4);
            Debug.Assert(getted.Equals(strs[2]));

            s = new SymbolsStack();
            for (int i = 0; i < 100; i++)
            {
                s.Push(Convert.ToString(i));
            }
            Debug.Assert(s.Lenght == 100);
            for (int i = 99; i >= 0; i--)
            {
                Debug.Assert(Convert.ToString(i).Equals(s.Pop()));
            }
            Debug.Assert(s.Lenght == 0);
        }