已经完成「Dodo」脚本对自定义方法参数的支持

This commit is contained in:
zengwenjie
2025-10-16 12:12:11 +08:00
parent fdcef37be3
commit 7d18b88172
2 changed files with 37 additions and 20 deletions

View File

@@ -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();

View File

@@ -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)
@@ -617,9 +627,13 @@ namespace Deedy.Testing
/// </summary>
/// <param name="cmdArgs">弹出数据的存放位置</param>
protected void CmdS_PopV(string cmdArgs)
{
string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
foreach (var arg in args)
{
if (this.Invoke_ArgsStack.TryPop(out var param))
this.ParamSetter(cmdArgs, 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))