using Convention.RScript.Parser; using System.Collections; using System.Diagnostics.CodeAnalysis; namespace Convention.RScript { public class BreakpointRunner : IRSentenceRunner { public void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { parser.Compile(sentence.content); } [return: MaybeNull] public object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { // 检查并跳转到当前命名空间的结束位置 if (parser.Evaluate(sentence.content)) { if (context.RuntimePointerStack.Count == 0) { context.CurrentRuntimePointer = context.Sentences.Length; } else if (context.NamespaceLayer.TryGetValue(context.RuntimePointerStack.Peek(), out var exitPointer)) { context.CurrentRuntimePointer = exitPointer; return context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); } else { throw new RScriptRuntimeException($"No namespace to break.", context.CurrentRuntimePointer); } } return null; } [return: MaybeNull] public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { // 检查并跳转到当前命名空间的结束位置 if (parser.Evaluate(sentence.content)) { if (context.RuntimePointerStack.Count == 0) { context.CurrentRuntimePointer = context.Sentences.Length; } else if (context.NamespaceLayer.TryGetValue(context.RuntimePointerStack.Peek(), out var exitPointer)) { context.CurrentRuntimePointer = exitPointer; yield return context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].RunAsync(parser, context.CurrentSentence, context); } else { throw new RScriptRuntimeException($"No namespace to break.", context.CurrentRuntimePointer); } } } } }