From 4f358c9664a77ffa0f5e400a1bd60b9694049540 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Tue, 14 Oct 2025 22:56:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RScriptContext.cs | 50 +++++++++++++++++++++++++++++++++++------------ RScriptEngine.cs | 13 +++++++++++- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/RScriptContext.cs b/RScriptContext.cs index 39ea410..ea0bf44 100644 --- a/RScriptContext.cs +++ b/RScriptContext.cs @@ -1,6 +1,7 @@ using Convention.RScript.Matcher; using Convention.RScript.Parser; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; @@ -293,17 +294,13 @@ namespace Convention.RScript } } - private void RunNextStep(ExpressionParser parser) + private object RunNextStep(ExpressionParser parser) { var sentence = CurrentSentence; switch (sentence.mode) { case RScriptSentence.Mode.Expression: - { - // 执行表达式 - parser.Evaluate(sentence.content); - } - break; + return parser.Evaluate(sentence.content); case RScriptSentence.Mode.DefineVariable: { DoDefineVariable(parser, sentence); @@ -326,7 +323,7 @@ namespace Convention.RScript break; case RScriptSentence.Mode.Breakpoint: { - DoBreakpoint(parser,sentence); + DoBreakpoint(parser, sentence); } break; case RScriptSentence.Mode.Backpoint: @@ -338,6 +335,7 @@ namespace Convention.RScript // Do nothing break; } + return null; } private readonly Stack RuntimePointerStack = new(); @@ -345,7 +343,17 @@ namespace Convention.RScript private int CurrentRuntimePointer = 0; private readonly Stack> CurrentLocalSpaceVariableNames = new(); - public Dictionary Run(ExpressionParser parser) + public Dictionary GetCurrentVariables() + { + Dictionary result = new(); + foreach (var (key, value) in Variables) + { + result[key] = value; + } + return result; + } + + public void Run(ExpressionParser parser) { CurrentLocalSpaceVariableNames.Clear(); RuntimePointerStack.Clear(); @@ -362,12 +370,30 @@ namespace Convention.RScript if (Variables.ContainsKey(varName)) Variables.SetValue(varName, varValue); } - Dictionary result = new(); - foreach (var (key, value) in Variables) + } + + public IEnumerator RunAsync(ExpressionParser parser) + { + CurrentLocalSpaceVariableNames.Clear(); + RuntimePointerStack.Clear(); + GotoPointerStack.Clear(); + CurrentLocalSpaceVariableNames.Clear(); + CurrentLocalSpaceVariableNames.Push(new()); + for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++) { - result[key] = value; + 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; } } } diff --git a/RScriptEngine.cs b/RScriptEngine.cs index 7ed71ee..3862704 100644 --- a/RScriptEngine.cs +++ b/RScriptEngine.cs @@ -1,5 +1,6 @@ using Convention.RScript.Parser; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -105,7 +106,17 @@ namespace Convention.RScript context = new(SplitScript(script).ToArray(), import, variables); foreach (var type in context.Import) 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); } } }