/// <summary> /// 在指定的调用堆栈上做递归寻指 /// </summary> /// <param name="vsm">关于哪个调用堆栈做动作</param> /// <returns>动作实例</returns> private SceneAction FetchNextInstruction(StackMachine vsm) { // 调用栈已经为空时预备退出 if (vsm.Count() == 0) { return(null); } // 取出当前要执行的指令 if (vsm.ESP.State != StackMachineState.Interpreting && vsm.ESP.State != StackMachineState.FunctionCalling) { return(null); } SceneAction ret = vsm.ESP.IP; // 如果没有下一指令就弹栈 if (ret == null) { this.ExitCall(vsm); // 递归寻指 return(this.FetchNextInstruction(vsm)); } // 如果没有条件子句 if (ret.CondPolish == String.Empty) { // 处理控制流程 switch (ret.Type) { case SActionType.NOP: case SActionType.act_function: case SActionType.act_for: // 优先进入trueRouting if (ret.TrueRouting != null && ret.TrueRouting.Count > 0) { return(vsm.ESP.MircoStep(ret.TrueRouting[0])); } // falseRouting if (ret.FalseRouting != null && ret.FalseRouting.Count > 0) { return(vsm.ESP.MircoStep(ret.FalseRouting[0])); } // next return(vsm.ESP.MacroStep(ret)); case SActionType.act_endfor: // endfor直接跳过 return(vsm.ESP.MacroStep(ret)); } // 移动下一指令指针,为下次处理做准备 return(vsm.ESP.MacroStep(ret)); } // 条件子句不为空时 else { // 计算条件真值 bool condBoolean = PolishEvaluator.EvaluateBoolean(ret.CondPolish, vsm); // 处理控制流程 switch (ret.Type) { // IF语句 case SActionType.act_if: // 条件为真且有真分支 if (condBoolean == true && ret.TrueRouting != null && ret.TrueRouting.Count > 0) { // 移动下一指令指针,进入trueRouting ret = vsm.ESP.MircoStep(ret.TrueRouting[0]); } // 条件为假且有假分支 else if (condBoolean == false && ret.FalseRouting != null && ret.FalseRouting.Count > 0) { // 移动下一指令指针,进入falseRouting ret = vsm.ESP.MircoStep(ret.FalseRouting[0]); } // 没有执行的语句时,移动指令指针到next节点 else { // 跳过if语句 ret = vsm.ESP.MacroStep(ret); } // 返回当前要执行的指令实例 return(ret); // FOR语句 case SActionType.act_for: // 如果条件为真就进入真分支 if (condBoolean == true && ret.TrueRouting != null && ret.TrueRouting.Count > 0) { // 移动下一指令指针,进入trueRouting ret = vsm.ESP.MircoStep(ret.TrueRouting[0]); } // 如果条件为假直接跳过for语句 else { // 跳过if语句 ret = vsm.ESP.MacroStep(ret); } // 返回当前要执行的指令实例 return(ret); // 除此以外,带了cond的语句,为真才执行 default: if (condBoolean == false) { // 跳过当前语句 ret = vsm.ESP.MacroStep(ret); } // 返回当前要执行的指令实例 return(ret); } } }