Example #1
0
        /// <summary>
        /// 分析当前的符号。
        /// </summary>
        /// <param name="token">要分析的符号。</param>
        public override void Parse(Token <T> token)
        {
            if (token.IsEndOfFile)
            {
                if (stateStack.Count == 1)
                {
                    return;
                }
            }
            while (true)
            {
                int         state  = stateStack.Peek();
                ParseAction action = GetAction(state, token.Id);
                switch (action.ActionType)
                {
                case ParseActionType.Shift:
                    Shift(token, action.Index);
                    goto ReduceByUnique;

                case ParseActionType.Reduce:
                    Reduce(action.Index);
                    break;

                case ParseActionType.Accept:
                    stateStack.Pop();
                    result = tokenStack.Pop();
                    return;

                case ParseActionType.Error:
                    ReportError(state, token);
                    // ErrorRecovery(state, token.Id);
                    return;
                }
            }
ReduceByUnique:
            // 尝试根据唯一归约进行归约。
            while (true)
            {
                int         state  = stateStack.Peek();
                ParseAction action = rule.States[state].Actions[Constants.UniqueIdx];
                switch (action.ActionType)
                {
                case ParseActionType.Reduce:
                    Reduce(action.Index);
                    break;

                case ParseActionType.Error:
                    return;
                }
            }
        }
Example #2
0
        public void PeekTest()
        {
            list.Push(1);
            list.Push(2);
            list.Push(3);

            Assert.AreEqual(list.Peek(), 3);
            Assert.IsTrue(list.IsContaining(3));
        }
 private static void SafePopFromStack(ListStack<string> stack, Activity activity) 
 { 
     if (stack.Count == 0) 
         throw new InvalidOperationException("Стек пуст"); 
     var top = stack.Peek(); 
     if (string.CompareOrdinal(top, activity.Name) != 0) 
         throw new InvalidOperationException("На вершине стека другое действие: " + top); 
     stack.Pop(); 
 } 
 private bool IsStackCorrectForExecuteActivity(Activity nextExecutingActivity) 
 { 
     lock (s_activitiesStackSync) 
     { 
         return 
             _executingActivitiesStack.Count == 0 || 
             (nextExecutingActivity.Parent != null && 
              _executingActivitiesStack.Peek() == nextExecutingActivity.Parent.Name); 
     } 
 } 
 private void ExecutingActivitiesStackPop() 
 { 
     lock (s_activitiesStackSync) 
     { 
         var popName = _executingActivitiesStack.Pop(); 
         if (_trackingActivitiesStack.Count > 0 && 
             string.CompareOrdinal(_trackingActivitiesStack.Peek(), popName) == 0) 
             _trackingActivitiesStack.Pop(); 
     } 
 } 
 public override int Mark()
 {
     _realTokens.Push(_realTokens.Peek());
     return(base.Mark());
 }