新增重新运行的函数

This commit is contained in:
2025-12-09 11:17:31 +08:00
parent 39aab608a6
commit e4b7dc0f55
2 changed files with 52 additions and 1 deletions

View File

@@ -91,6 +91,8 @@ namespace Convention.RScript
Dictionary<string, RScriptVariableEntry> GetCurrentVariables(); Dictionary<string, RScriptVariableEntry> GetCurrentVariables();
void Run(ExpressionParser parser); void Run(ExpressionParser parser);
IEnumerator RunAsync(ExpressionParser parser); IEnumerator RunAsync(ExpressionParser parser);
public void ReRun(ExpressionParser parser);
public IEnumerator ReRunAsync(ExpressionParser parser);
SerializableClass Compile(ExpressionParser parser); SerializableClass Compile(ExpressionParser parser);
SerializableClass CompileFromCurrent(ExpressionParser parser); SerializableClass CompileFromCurrent(ExpressionParser parser);
} }
@@ -327,6 +329,21 @@ namespace Convention.RScript
} }
} }
private void ResetAndSureRunAgain(ExpressionParser parser)
{
StepCount = 0;
CurrentLocalSpaceVariableNames.Clear();
RuntimePointerStack.Clear();
GotoPointerStack.Clear();
CurrentLocalSpaceVariableNames.Clear();
CurrentLocalSpaceVariableNames.Push(new());
JumpPointerCache.Clear();
foreach (var (name, varObject) in Variables)
{
parser.context.Variables[name] = varObject.data;
}
}
private void AfterRun(ExpressionParser parser) private void AfterRun(ExpressionParser parser)
{ {
foreach (var (varName, varValue) in parser.context.Variables) foreach (var (varName, varValue) in parser.context.Variables)
@@ -361,6 +378,31 @@ namespace Convention.RScript
AfterRun(parser); AfterRun(parser);
} }
public void ReRun(ExpressionParser parser)
{
ResetAndSureRunAgain(parser);
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{
RunNextStep(parser);
}
AfterRun(parser);
}
public IEnumerator ReRunAsync(ExpressionParser parser)
{
ResetAndSureRunAgain(parser);
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{
var ret = RunNextStep(parser);
if (ret is IEnumerator ir)
{
yield return ir;
}
yield return null;
}
AfterRun(parser);
}
public SerializableClass Compile(ExpressionParser parser) public SerializableClass Compile(ExpressionParser parser)
{ {
BeforeRun(parser); BeforeRun(parser);

View File

@@ -145,7 +145,6 @@ namespace Convention.RScript
context = CreateContext(SplitScript(script).ToArray(), import, variables); context = CreateContext(SplitScript(script).ToArray(), import, variables);
return context.RunAsync(parser); return context.RunAsync(parser);
} }
public SerializableClass Compile(string script, RScriptImportClass import = null, RScriptVariables variables = null) public SerializableClass Compile(string script, RScriptImportClass import = null, RScriptVariables variables = null)
{ {
parser = new(new()); parser = new(new());
@@ -173,5 +172,15 @@ namespace Convention.RScript
context = CreateContext(data, import, variables); context = CreateContext(data, import, variables);
yield return context.RunAsync(parser); yield return context.RunAsync(parser);
} }
public Dictionary<string, RScriptVariableEntry> ReRun()
{
context.ReRun(parser);
return context.GetCurrentVariables();
}
public IEnumerator ReRunAsync()
{
return context.ReRunAsync(parser);
}
} }
} }