예제 #1
0
        public void PushContext(WamInstructionStream instructionStream)
        {
            if (instructionStream == null)
            {
                throw new ArgumentNullException("instructionStream");
            }

            var context = new WamContext();

            _contextStack.Push(context);
            CurrentContext = context;

            State = WamMachineStates.Run;
            InstructionPointer       = new WamInstructionPointer(instructionStream);
            ReturnInstructionPointer = WamInstructionPointer.Undefined;
            StackIndex = 0;

            Environment = null;
            ChoicePoint = null;
            ArgumentRegisters.Clear();
            TemporaryRegisters.Clear();

            CurrentStructure      = null;
            CurrentStructureIndex = -1;
        }
예제 #2
0
        bool Backtrack()
        {
            if (State != WamMachineStates.Backtrack)
            {
                throw new InvalidOperationException("Backtrack not required.");
            }

            if (ChoicePoint == null)
            {
                return(false);
            }

            UnwindTrail();

            Environment = ChoicePoint.Environment;
            StackIndex  = ChoicePoint.StackIndex;
            ReturnInstructionPointer = ChoicePoint.ReturnInstructionPointer;
            ArgumentRegisters.Copy(ChoicePoint.ArgumentRegisters);
            CutChoicePoint = ChoicePoint.CutChoicePoint;

            InstructionPointer  = ChoicePoint.BacktrackInstructionPointer;
            PredicateEnumerator = ChoicePoint.PredicateEnumerator;

            return(true);
        }