优化跳转
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Convention.RScript.Parser;
|
using Convention.RScript.Parser;
|
||||||
|
using System;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
namespace Convention.RScript.Runner
|
namespace Convention.RScript.Runner
|
||||||
@@ -7,54 +8,51 @@ namespace Convention.RScript.Runner
|
|||||||
{
|
{
|
||||||
protected static void DoJumpRuntimePointer(ExpressionParser parser, int target, RScriptContext context)
|
protected static void DoJumpRuntimePointer(ExpressionParser parser, int target, RScriptContext context)
|
||||||
{
|
{
|
||||||
|
int currentPointer = context.CurrentRuntimePointer;
|
||||||
bool isForwardMove = target > context.CurrentRuntimePointer;
|
bool isForwardMove = target > context.CurrentRuntimePointer;
|
||||||
int step = isForwardMove ? 1 : -1;
|
int step = isForwardMove ? 1 : -1;
|
||||||
int insLayer = 0;
|
int depth = 0;
|
||||||
|
int lastLayer = 0;
|
||||||
for (; context.CurrentRuntimePointer != target; context.CurrentRuntimePointer += step)
|
for (; context.CurrentRuntimePointer != target; context.CurrentRuntimePointer += step)
|
||||||
{
|
{
|
||||||
if (context.CurrentSentence.mode == RScriptSentence.Mode.ExitNamespace)
|
if (context.CurrentSentence.mode == RScriptSentence.Mode.ExitNamespace)
|
||||||
{
|
{
|
||||||
if (isForwardMove)
|
if (isForwardMove)
|
||||||
{
|
lastLayer--;
|
||||||
if (insLayer > 0)
|
|
||||||
insLayer--;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int disLayer = -insLayer; disLayer > 0; disLayer--)
|
|
||||||
context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
insLayer++;
|
lastLayer++;
|
||||||
}
|
}
|
||||||
else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace)
|
else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace)
|
||||||
{
|
{
|
||||||
if (isForwardMove)
|
if (isForwardMove)
|
||||||
insLayer++;
|
lastLayer++;
|
||||||
else
|
else
|
||||||
{
|
lastLayer--;
|
||||||
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)
|
depth = lastLayer < depth ? lastLayer : depth;
|
||||||
|
}
|
||||||
|
// 对上层的最深影响
|
||||||
|
for (; depth < 0; depth++)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
for (; insLayer > 0; insLayer--)
|
context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context);
|
||||||
{
|
|
||||||
context.SentenceRunners[RScriptSentence.Mode.EnterNamespace].Run(parser, context.CurrentSentence, context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (insLayer < 0)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
for (; insLayer < 0; insLayer++)
|
throw new RScriptRuntimeException($"Jump pointer with error", currentPointer, ex);
|
||||||
{
|
}
|
||||||
context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context);
|
}
|
||||||
}
|
// 恢复正确的层数
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user