已经完成「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)
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user