using Convention.RScript.Parser; using System.Diagnostics.CodeAnalysis; namespace Convention.RScript.Runner { public abstract class JumpRuntimePointerRunner : IRSentenceRunner { protected static void DoJumpRuntimePointer(ExpressionParser parser, int target, RScriptContext context) { bool isForwardMove = target > context.CurrentRuntimePointer; int step = isForwardMove ? 1 : -1; int insLayer = 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); } } else insLayer++; } else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace) { if (isForwardMove) insLayer++; else { if (insLayer > 0) insLayer--; else { for (int disLayer = -insLayer; disLayer > 0; disLayer--) context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); } } } if (insLayer > 0) { for (; insLayer > 0; insLayer--) { context.SentenceRunners[RScriptSentence.Mode.EnterNamespace].Run(parser, context.CurrentSentence, context); } } else if (insLayer < 0) { for (; insLayer < 0; insLayer++) { context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); } } } } public abstract void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); [return: MaybeNull] public abstract object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); } }