Exemplo n.º 1
0
        /// <summary>
        /// LR(0)的Closure操作。
        /// 补全一个状态。
        /// </summary>
        /// <param name="list"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        static LR0State Closure(this RegulationList list, LR0State state)
        {
            Queue <LR0Item> queue = new Queue <LR0Item>();

            foreach (var item in state)
            {
                queue.Enqueue(item);
            }
            while (queue.Count > 0)
            {
                LR0Item      item = queue.Dequeue();
                TreeNodeType node = item.GetNodeNext2Dot();
                if (node == null)
                {
                    continue;
                }

                foreach (var regulation in list)
                {
                    if (regulation.Left == node)
                    {
                        var newItem = new LR0Item(regulation, 0);
                        if (state.TryInsert(newItem))
                        {
                            queue.Enqueue(newItem);
                        }
                    }
                }
            }

            return(state);
        }
Exemplo n.º 2
0
        /// <summary>
        /// LR(0)的Goto操作。
        /// 将圆点移到所有LR(0)项中的符号<paramref name="x"/>之后。
        /// </summary>
        /// <param name="list"></param>
        /// <param name="state"></param>
        /// <param name="x">一个文法符号,终结点或非终结点。</param>
        /// <returns></returns>
        static LR0State Goto(this RegulationList list, LR0State state, TreeNodeType x)
        {
            LR0State toState = new LR0State();

            foreach (var item in state)
            {
                TreeNodeType nextNode = item.GetNodeNext2Dot();
                if (nextNode == x)
                {
                    var newItem = new LR0Item(item.Regulation, item.DotPosition + 1);
                    toState.TryInsert(newItem);
                }
            }

            return(Closure(list, toState));
        }