已经完成「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 var1 111
VarP var2 222 VarP var2 222
Func Add var1 var2 Func Add var1x var2x
LetP AddResult -1 LetP AddResult -1
math AddResult var1 var2 + math AddResult @var1x 777 + @var2 - @var2x -
retu AddResult retu AddResult
EndF EndF
Call Add var1 var2 Call Add @var1 99
PopV result PopV result
"; ";
Todo todo = new Todo(); Todo todo = new Todo();

View File

@@ -374,7 +374,7 @@ namespace Deedy.Testing
string cmd = Pre_Hand(this.Script[index]); string cmd = Pre_Hand(this.Script[index]);
if (cmd == "whil") if (cmd == "whil")
{ {
string cmdArgs = this.Script[index][4..].Trim(); string cmdArgs = this.Script[index][cmd.Length..].Trim();
if (this.CmdP_Cond(cmdArgs)) if (this.CmdP_Cond(cmdArgs))
this.Control_CurrentLine = index + 1; this.Control_CurrentLine = index + 1;
return; return;
@@ -451,8 +451,8 @@ namespace Deedy.Testing
{ {
object paramValue = this.Val_Variant(paramDefine[1]); object paramValue = this.Val_Variant(paramDefine[1]);
if (!Param_Global.TryAdd(paramDefine[0], paramValue)) if (!Param_Global.TryAdd(paramDefine[0].TrimStart('@'), paramValue))
this.Param_Global[paramDefine[0]] = paramValue; this.Param_Global[paramDefine[0].TrimStart('@')] = paramValue;
} }
this.Control_CurrentLine++; this.Control_CurrentLine++;
} }
@@ -471,8 +471,8 @@ namespace Deedy.Testing
{ {
object paramValue = this.Val_Variant(paramDefine[1]); object paramValue = this.Val_Variant(paramDefine[1]);
if (!funcHandle.LocalParams.TryAdd(paramDefine[0], paramValue)) if (!funcHandle.LocalParams.TryAdd(paramDefine[0].TrimStart('@'), paramValue))
funcHandle.LocalParams[paramDefine[0]] = paramValue; funcHandle.LocalParams[paramDefine[0].TrimStart('@')] = paramValue;
} }
else this.CmdI_VarP(cmdArgs ?? ""); else this.CmdI_VarP(cmdArgs ?? "");
} }
@@ -556,7 +556,7 @@ namespace Deedy.Testing
break; 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; this.Control_CurrentLine = index + 1;
return; return;
} }
@@ -577,13 +577,23 @@ namespace Deedy.Testing
return; return;
} }
string funcName = args[0]; 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) foreach (var func in this.FuncDefines)
{ {
if (func.Name == funcName) if (func.Name == funcName)
{ {
this.Invoke_FuncStack.Push(new Def_FuncInvoke(this.Control_CurrentLine + 1)); 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; break;
} }
} }
@@ -595,12 +605,12 @@ namespace Deedy.Testing
/// <param name="cmdArgs">方法名及参数表,参数表可以为空</param> /// <param name="cmdArgs">方法名及参数表,参数表可以为空</param>
protected void CmdI_Exec(string cmdArgs) protected void CmdI_Exec(string cmdArgs)
{ {
string[] argParts = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries); string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
if (argParts.Length > 0) if (args.Length > 0)
{ {
string procName = argParts[0]; string procName = args[0];
for (int i = 1; i < argParts.Length; i++) for (int i = 1; i < args.Length; i++)
this.Invoke_ArgsStack.Push(this.ParamGetter(argParts[i], 0)); this.Invoke_ArgsStack.Push(this.ParamGetter(args[i], 0));
foreach (var func in this.FuncImports) foreach (var func in this.FuncImports)
{ {
if (func.Name == procName) if (func.Name == procName)
@@ -618,8 +628,12 @@ namespace Deedy.Testing
/// <param name="cmdArgs">弹出数据的存放位置</param> /// <param name="cmdArgs">弹出数据的存放位置</param>
protected void CmdS_PopV(string cmdArgs) protected void CmdS_PopV(string cmdArgs)
{ {
if (this.Invoke_ArgsStack.TryPop(out var param)) string[] args = (cmdArgs ?? "").Split(' ', options: StringSplitOptions.RemoveEmptyEntries);
this.ParamSetter(cmdArgs, param); foreach (var arg in args)
{
if (this.Invoke_ArgsStack.TryPop(out var param))
this.ParamSetter(arg, param);
}
this.Control_CurrentLine++; this.Control_CurrentLine++;
} }
/// <summary> /// <summary>
@@ -628,7 +642,8 @@ namespace Deedy.Testing
/// <param name="cmdArgs">值表达式支持bool、double、@ParamName|string</param> /// <param name="cmdArgs">值表达式支持bool、double、@ParamName|string</param>
protected void CmdS_Push(string cmdArgs) 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++; this.Control_CurrentLine++;
} }
/// <summary> /// <summary>
@@ -665,7 +680,7 @@ namespace Deedy.Testing
case ">>": Math_ShR(stack); break; case ">>": Math_ShR(stack); break;
case "<<": Math_ShL(stack); break; case "<<": Math_ShL(stack); break;
default: default:
stack.Push(this.Val_Double(this.ParamGetter(cmdParts[index], 0))); stack.Push(this.Val_Double(cmdParts[index]));
break; break;
} }
index++; index++;
@@ -1046,6 +1061,7 @@ namespace Deedy.Testing
private void ParamSetter(string paramName, object paramValue) private void ParamSetter(string paramName, object paramValue)
{ {
//HACK暂时不支持代码块级的局部变量 //HACK暂时不支持代码块级的局部变量
paramName = paramName.TrimStart('@');
if (this.Invoke_FuncStack.TryPeek(out var funcHandle)) if (this.Invoke_FuncStack.TryPeek(out var funcHandle))
{ {
if (funcHandle.LocalParams.ContainsKey(paramName)) if (funcHandle.LocalParams.ContainsKey(paramName))
@@ -1080,6 +1096,7 @@ namespace Deedy.Testing
private object ParamGetter(string paramName, object @default) private object ParamGetter(string paramName, object @default)
{ {
//HACK暂时不支持代码块级的局部变量 //HACK暂时不支持代码块级的局部变量
paramName = paramName.TrimStart('@');
if (this.Invoke_FuncStack.TryPeek(out var funcHandle)) if (this.Invoke_FuncStack.TryPeek(out var funcHandle))
{ {
if (funcHandle.LocalParams.TryGetValue(paramName, out object? localValue)) if (funcHandle.LocalParams.TryGetValue(paramName, out object? localValue))