Пример #1
0
        /// <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);
                }
            }
        }