新增迭代器异步运行

This commit is contained in:
2025-10-14 22:56:22 +08:00
parent 90ae999ba2
commit 4f358c9664
2 changed files with 50 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
using Convention.RScript.Matcher; using Convention.RScript.Matcher;
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -293,17 +294,13 @@ namespace Convention.RScript
} }
} }
private void RunNextStep(ExpressionParser parser) private object RunNextStep(ExpressionParser parser)
{ {
var sentence = CurrentSentence; var sentence = CurrentSentence;
switch (sentence.mode) switch (sentence.mode)
{ {
case RScriptSentence.Mode.Expression: case RScriptSentence.Mode.Expression:
{ return parser.Evaluate(sentence.content);
// 执行表达式
parser.Evaluate(sentence.content);
}
break;
case RScriptSentence.Mode.DefineVariable: case RScriptSentence.Mode.DefineVariable:
{ {
DoDefineVariable(parser, sentence); DoDefineVariable(parser, sentence);
@@ -338,6 +335,7 @@ namespace Convention.RScript
// Do nothing // Do nothing
break; break;
} }
return null;
} }
private readonly Stack<int> RuntimePointerStack = new(); private readonly Stack<int> RuntimePointerStack = new();
@@ -345,7 +343,17 @@ namespace Convention.RScript
private int CurrentRuntimePointer = 0; private int CurrentRuntimePointer = 0;
private readonly Stack<HashSet<string>> CurrentLocalSpaceVariableNames = new(); private readonly Stack<HashSet<string>> CurrentLocalSpaceVariableNames = new();
public Dictionary<string, RScriptVariableEntry> Run(ExpressionParser parser) public Dictionary<string, RScriptVariableEntry> GetCurrentVariables()
{
Dictionary<string, RScriptVariableEntry> result = new();
foreach (var (key, value) in Variables)
{
result[key] = value;
}
return result;
}
public void Run(ExpressionParser parser)
{ {
CurrentLocalSpaceVariableNames.Clear(); CurrentLocalSpaceVariableNames.Clear();
RuntimePointerStack.Clear(); RuntimePointerStack.Clear();
@@ -362,12 +370,30 @@ namespace Convention.RScript
if (Variables.ContainsKey(varName)) if (Variables.ContainsKey(varName))
Variables.SetValue(varName, varValue); Variables.SetValue(varName, varValue);
} }
Dictionary<string, RScriptVariableEntry> result = new(); }
foreach (var (key, value) in Variables)
public IEnumerator RunAsync(ExpressionParser parser)
{ {
result[key] = value; CurrentLocalSpaceVariableNames.Clear();
RuntimePointerStack.Clear();
GotoPointerStack.Clear();
CurrentLocalSpaceVariableNames.Clear();
CurrentLocalSpaceVariableNames.Push(new());
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{
var ret = RunNextStep(parser);
if (ret is IEnumerator ir)
{
yield return ir;
}
yield return null;
}
// 更新上下文变量
foreach (var (varName, varValue) in parser.context.Variables)
{
if (Variables.ContainsKey(varName))
Variables.SetValue(varName, varValue);
} }
return result;
} }
} }
} }

View File

@@ -1,5 +1,6 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -105,7 +106,17 @@ namespace Convention.RScript
context = new(SplitScript(script).ToArray(), import, variables); context = new(SplitScript(script).ToArray(), import, variables);
foreach (var type in context.Import) foreach (var type in context.Import)
parser.context.Imports.AddType(type); parser.context.Imports.AddType(type);
return context.Run(parser); context.Run(parser);
return context.GetCurrentVariables();
}
public IEnumerator RunAsync(string script, RScriptImportClass import = null, RScriptVariables variables = null)
{
parser = new(new());
context = new(SplitScript(script).ToArray(), import, variables);
foreach (var type in context.Import)
parser.context.Imports.AddType(type);
return context.RunAsync(parser);
} }
} }
} }