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