新增重新运行的函数
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user