/// <summary> /// Enqueue all reductions that use newly-created link /// </summary> private void EnqueueLimitedReductions(int lookahead, GssStateLink link) { foreach (var n in gss.Topmost) { foreach (Reduction red in GetReductions(n.State, lookahead)) { EnqueueReductionPaths(n, red, link); } } }
private void EnqueueReductionPaths(GssStateNode v, Reduction red, GssStateLink mustUseLink) { var size = red.Rule.Parts.Length; foreach (GssReducePath path in gss.GetReducePaths(v, size)) { if (mustUseLink != null && (size == 0 || path.RightmostLink != mustUseLink)) { continue; } path.LeftmostStateNode = size == 0 ? v : path.First.Link.PreviousState; path.Size = size; path.Rule = red.Rule; worklist.Enqueue(path); } }