コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }