已经完成「Dodo」脚本对自定义方法参数的支持
This commit is contained in:
		@@ -16,13 +16,13 @@ namespace Deedy
 | 
			
		||||
@"
 | 
			
		||||
VarP var1 111
 | 
			
		||||
VarP var2 222
 | 
			
		||||
Func Add var1 var2
 | 
			
		||||
Func Add var1x var2x
 | 
			
		||||
    LetP AddResult -1
 | 
			
		||||
    math AddResult var1 var2 +
 | 
			
		||||
    math AddResult @var1x 777 + @var2 - @var2x -
 | 
			
		||||
    retu AddResult
 | 
			
		||||
EndF
 | 
			
		||||
 | 
			
		||||
Call Add var1 var2
 | 
			
		||||
Call Add @var1 99
 | 
			
		||||
PopV result
 | 
			
		||||
";
 | 
			
		||||
            Todo todo = new Todo();
 | 
			
		||||
 
 | 
			
		||||
@@ -374,7 +374,7 @@ namespace Deedy.Testing
 | 
			
		||||
                string cmd = Pre_Hand(this.Script[index]);
 | 
			
		||||
                if (cmd == "whil")
 | 
			
		||||
                {
 | 
			
		||||
                    string cmdArgs = this.Script[index][4..].Trim();
 | 
			
		||||
                    string cmdArgs = this.Script[index][cmd.Length..].Trim();
 | 
			
		||||
                    if (this.CmdP_Cond(cmdArgs))
 | 
			
		||||
                        this.Control_CurrentLine = index + 1;
 | 
			
		||||
                    return;
 | 
			
		||||
@@ -451,8 +451,8 @@ namespace Deedy.Testing
 | 
			
		||||
            {
 | 
			
		||||
                object paramValue = this.Val_Variant(paramDefine[1]);
 | 
			
		||||
 | 
			
		||||
                if (!Param_Global.TryAdd(paramDefine[0], paramValue))
 | 
			
		||||
                    this.Param_Global[paramDefine[0]] = paramValue;
 | 
			
		||||
                if (!Param_Global.TryAdd(paramDefine[0].TrimStart('@'), paramValue))
 | 
			
		||||
                    this.Param_Global[paramDefine[0].TrimStart('@')] = paramValue;
 | 
			
		||||
            }
 | 
			
		||||
            this.Control_CurrentLine++;
 | 
			
		||||
        }
 | 
			
		||||
@@ -471,8 +471,8 @@ namespace Deedy.Testing
 | 
			
		||||
                {
 | 
			
		||||
                    object paramValue = this.Val_Variant(paramDefine[1]);
 | 
			
		||||
 | 
			
		||||
                    if (!funcHandle.LocalParams.TryAdd(paramDefine[0], paramValue))
 | 
			
		||||
                        funcHandle.LocalParams[paramDefine[0]] = paramValue;
 | 
			
		||||
                    if (!funcHandle.LocalParams.TryAdd(paramDefine[0].TrimStart('@'), paramValue))
 | 
			
		||||
                        funcHandle.LocalParams[paramDefine[0].TrimStart('@')] = paramValue;
 | 
			
		||||
                }
 | 
			
		||||
                else this.CmdI_VarP(cmdArgs ?? "");
 | 
			
		||||
            }
 | 
			
		||||
@@ -556,7 +556,7 @@ namespace Deedy.Testing
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    this.FuncDefines.Add(new Def_FuncDefine(funcName, this.Control_CurrentLine + 1));
 | 
			
		||||
                    this.FuncDefines.Add(new Def_FuncDefine(funcName, this.Control_CurrentLine));
 | 
			
		||||
                    this.Control_CurrentLine = index + 1;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
@@ -577,13 +577,23 @@ namespace Deedy.Testing
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            string funcName = args[0];
 | 
			
		||||
            for (int i = 1; i < args.Length; i++) this.Invoke_ArgsStack.Push(this.ParamGetter(args[i], 0));
 | 
			
		||||
            for (int i = 1; i < args.Length; i++) this.Invoke_ArgsStack.Push(this.Val_Variant(args[i]));
 | 
			
		||||
            foreach (var func in this.FuncDefines)
 | 
			
		||||
            {
 | 
			
		||||
                if (func.Name == funcName)
 | 
			
		||||
                {
 | 
			
		||||
                    this.Invoke_FuncStack.Push(new Def_FuncInvoke(this.Control_CurrentLine + 1));
 | 
			
		||||
                    this.Control_CurrentLine = func.Line;
 | 
			
		||||
                    //TODO:根据「Func」指令定义声明局部变量
 | 
			
		||||
                    string[] funcArgs = this.Script[func.Line].Split(' ', options: StringSplitOptions.RemoveEmptyEntries)[2..];
 | 
			
		||||
                    Array.Reverse(funcArgs);
 | 
			
		||||
                    for (int i = 0; i < funcArgs.Length; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (this.Invoke_ArgsStack.TryPop(out var arg))
 | 
			
		||||
                        {
 | 
			
		||||
                            this.CmdI_LetP($"{funcArgs[i]} {arg}");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    this.Control_CurrentLine = func.Line + 1;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -595,12 +605,12 @@ namespace Deedy.Testing
 | 
			
		||||
        /// <param name="cmdArgs">方法名及参数表,参数表可以为空</param>
 | 
			
		||||
        protected void CmdI_Exec(string cmdArgs)
 | 
			
		||||
        {
 | 
			
		||||
            string[] argParts = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
            if (argParts.Length > 0)
 | 
			
		||||
            string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
            if (args.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                string procName = argParts[0];
 | 
			
		||||
                for (int i = 1; i < argParts.Length; i++)
 | 
			
		||||
                    this.Invoke_ArgsStack.Push(this.ParamGetter(argParts[i], 0));
 | 
			
		||||
                string procName = args[0];
 | 
			
		||||
                for (int i = 1; i < args.Length; i++)
 | 
			
		||||
                    this.Invoke_ArgsStack.Push(this.ParamGetter(args[i], 0));
 | 
			
		||||
                foreach (var func in this.FuncImports)
 | 
			
		||||
                {
 | 
			
		||||
                    if (func.Name == procName)
 | 
			
		||||
@@ -618,8 +628,12 @@ namespace Deedy.Testing
 | 
			
		||||
        /// <param name="cmdArgs">弹出数据的存放位置</param>
 | 
			
		||||
        protected void CmdS_PopV(string cmdArgs)
 | 
			
		||||
        {
 | 
			
		||||
            if (this.Invoke_ArgsStack.TryPop(out var param))
 | 
			
		||||
                this.ParamSetter(cmdArgs, param);
 | 
			
		||||
            string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
            foreach (var arg in args)
 | 
			
		||||
            {
 | 
			
		||||
                if (this.Invoke_ArgsStack.TryPop(out var param))
 | 
			
		||||
                    this.ParamSetter(arg, param);
 | 
			
		||||
            }
 | 
			
		||||
            this.Control_CurrentLine++;
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -628,7 +642,8 @@ namespace Deedy.Testing
 | 
			
		||||
        /// <param name="cmdArgs">值表达式:支持bool、double、@ParamName|string</param>
 | 
			
		||||
        protected void CmdS_Push(string cmdArgs)
 | 
			
		||||
        {
 | 
			
		||||
            this.Invoke_ArgsStack.Push(this.Val_Variant(cmdArgs));
 | 
			
		||||
            string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
            foreach (var arg in args) this.Invoke_ArgsStack.Push(this.Val_Variant(arg));
 | 
			
		||||
            this.Control_CurrentLine++;
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -665,7 +680,7 @@ namespace Deedy.Testing
 | 
			
		||||
                        case ">>": Math_ShR(stack); break;
 | 
			
		||||
                        case "<<": Math_ShL(stack); break;
 | 
			
		||||
                        default:
 | 
			
		||||
                            stack.Push(this.Val_Double(this.ParamGetter(cmdParts[index], 0)));
 | 
			
		||||
                            stack.Push(this.Val_Double(cmdParts[index]));
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                    index++;
 | 
			
		||||
@@ -1046,6 +1061,7 @@ namespace Deedy.Testing
 | 
			
		||||
        private void ParamSetter(string paramName, object paramValue)
 | 
			
		||||
        {
 | 
			
		||||
            //HACK:暂时不支持代码块级的局部变量
 | 
			
		||||
            paramName = paramName.TrimStart('@');
 | 
			
		||||
            if (this.Invoke_FuncStack.TryPeek(out var funcHandle))
 | 
			
		||||
            {
 | 
			
		||||
                if (funcHandle.LocalParams.ContainsKey(paramName))
 | 
			
		||||
@@ -1080,6 +1096,7 @@ namespace Deedy.Testing
 | 
			
		||||
        private object ParamGetter(string paramName, object @default)
 | 
			
		||||
        {
 | 
			
		||||
            //HACK:暂时不支持代码块级的局部变量
 | 
			
		||||
            paramName = paramName.TrimStart('@');
 | 
			
		||||
            if (this.Invoke_FuncStack.TryPeek(out var funcHandle))
 | 
			
		||||
            {
 | 
			
		||||
                if (funcHandle.LocalParams.TryGetValue(paramName, out object? localValue))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user