Esempio n. 1
0
        protected override void DispatchNode(Node downNode, object o)
        {
            Data data = o as Data;
            MemoSpecState memo = data.MemoSpecState;
            PointerToNode ptrUpNode = data.PointerToNode;
            this.state.Recall(memo, data.ObjectHashtable);

            BTType btType = Annotation.GetNodeBTType(downNode);
            if (btType == BTType.Static)
            {
                Node nextDownNode = this.state.InterpretNode(downNode);
                this.AddTask(nextDownNode, ptrUpNode);
            }
            else
            {
                Variable[] vars1;
                Node upNode;
                Variable[] vars2;
                this.getUpNode(downNode, memo, out vars1, out upNode, out vars2);
                if (upNode != null)
                    SpecializingVisitor.createSubstitution(vars2, vars1, ptrUpNode, upNode);
                else if (btType == BTType.eXclusive)
                    this.CallVisitorMethod(downNode, data);
                else
                {
                    upNode = ptrUpNode.Node = downNode.Clone();
                    for (int i = 0; i < downNode.NextArray.Count; i++)
                        this.AddTask(downNode.NextArray[i], new PointerToNode(upNode, i));
                }
            }

            if (ptrUpNode.Node != null)
                this.setUpAndDownNode(downNode, memo, ptrUpNode.Node);
        }
Esempio n. 2
0
        private void addTask(Node upNode, int brIndex, Node downNext, State state)
        {
            Node upNext = this.upDownNodes[downNext, state];
            if (upNext != null)
                upNode.NextArray[brIndex] = upNext;
            else
            {
                upNext = downNext.Clone();
                upNode.NextArray[brIndex] = upNext;

                this.upDownNodes.SetUpAndDownNode(downNext, state, upNext);
                this.AddTask(upNext, UpAndDownNodes.CloneState(state));
            }
        }