private void ReduceViaPath(GssReducePath path, Msg item) { int N = path.Rule.Left; GssStateNode leftSib = path.LeftmostStateNode; State k = leftSib.State; // TODO: Apply 'Duplicate' to all path semantic values Msg newItem = InvokeReduceAction(path, item); int newState = NonTermGoTo(k, N); var rightSib = gss.FindTopmost(newState); if (rightSib != null) { var link = gss.GetLink(rightSib, leftSib); if (link != null) { link.Item = MergeValues(newState, link.Item, newItem); } else { link = gss.AddLink(rightSib, leftSib, newItem); EnqueueLimitedReductions(item.Id, link); } } else { rightSib = gss.AddTopmost(newState); var link = gss.AddLink(rightSib, leftSib, newItem); EnqueueLimitedReductions(item.Id, 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); } }