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); } } }