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