From 7b48066aafbbb9479715961873fe2938b225daec Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Fri, 17 Oct 2025 16:42:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoRunner/JumpRuntimePointerRunner.cs | 60 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/DoRunner/JumpRuntimePointerRunner.cs b/DoRunner/JumpRuntimePointerRunner.cs index 24475f8..61cf07c 100644 --- a/DoRunner/JumpRuntimePointerRunner.cs +++ b/DoRunner/JumpRuntimePointerRunner.cs @@ -1,4 +1,5 @@ using Convention.RScript.Parser; +using System; using System.Diagnostics.CodeAnalysis; namespace Convention.RScript.Runner @@ -7,54 +8,51 @@ namespace Convention.RScript.Runner { protected static void DoJumpRuntimePointer(ExpressionParser parser, int target, RScriptContext context) { + int currentPointer = context.CurrentRuntimePointer; bool isForwardMove = target > context.CurrentRuntimePointer; int step = isForwardMove ? 1 : -1; - int insLayer = 0; + int depth = 0; + int lastLayer = 0; for (; context.CurrentRuntimePointer != target; context.CurrentRuntimePointer += step) { if (context.CurrentSentence.mode == RScriptSentence.Mode.ExitNamespace) { if (isForwardMove) - { - if (insLayer > 0) - insLayer--; - else - { - for (int disLayer = -insLayer; disLayer > 0; disLayer--) - context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); - } - } + lastLayer--; else - insLayer++; + lastLayer++; } else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace) { if (isForwardMove) - insLayer++; + lastLayer++; else - { - if (insLayer > 0) - insLayer--; - else - { - for (int disLayer = -insLayer; disLayer > 0; disLayer--) - context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); - } - } + lastLayer--; } - if (insLayer > 0) + depth = lastLayer < depth ? lastLayer : depth; + } + // 对上层的最深影响 + for (; depth < 0; depth++) + { + try { - for (; insLayer > 0; insLayer--) - { - context.SentenceRunners[RScriptSentence.Mode.EnterNamespace].Run(parser, context.CurrentSentence, context); - } + context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); } - else if (insLayer < 0) + catch (Exception ex) { - for (; insLayer < 0; insLayer++) - { - context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); - } + throw new RScriptRuntimeException($"Jump pointer with error", currentPointer, ex); + } + } + // 恢复正确的层数 + for (int i = depth, e = lastLayer; i < e; i++) + { + try + { + context.SentenceRunners[RScriptSentence.Mode.EnterNamespace].Run(parser, context.CurrentSentence, context); + } + catch (Exception ex) + { + throw new RScriptRuntimeException($"Jump pointer with error", currentPointer, ex); } } }