private static DState EClosure(DState dState) { Stack <Node> statesStack = new Stack <Node>(); DState res = new DState(); foreach (var node in dState.Nodes) { statesStack.Push(node); res.AddNode(node); } while (statesStack.Count > 0) { var state = statesStack.Pop(); foreach (var link in state.Start.Outputs) { if (link.Subj == Utils.eps && !res.Nodes.Contains(link.Destination)) { res.AddNode(link.Destination); statesStack.Push(link.Destination); } } } return(res); }
private static DState Move(DState dState, char a) { DState res = new DState(); //var epsState = EClosure(dState); foreach (var node in dState.Nodes) { foreach (var link in node.Start.Outputs) { if (link.Subj == a) { res.AddNode(link.Destination); } } } var epsState = EClosure(res); return(epsState); }