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