已经完成「Dodo」脚本对自定义方法参数的支持
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user