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