重写了Script的解释器代码,使其更加直观。重写了流程控制的部分代码,分离运行环境IOC与流程IOC。

This commit is contained in:
fengjiayi
2025-07-18 22:45:06 +08:00
parent 88de5a21f5
commit fc05cd662b
38 changed files with 567 additions and 1418 deletions

View File

@@ -13,7 +13,7 @@ namespace Serein.Script
IDynamicContext FlowContext { get; }
/// <summary>
/// 是否该退出了(由外部发出停止信号)
/// 是否该退出了(由 TokenSource 控制,用于响应外部发出停止信号)
/// </summary>
bool IsReturn { get; }
@@ -40,7 +40,7 @@ namespace Serein.Script
/// <param name="varName"></param>
/// <param name="value"></param>
/// <returns></returns>
bool SetVarValue(string varName, object value);
bool SetVarValue(string varName, object? value);
/// <summary>
/// 结束调用

View File

@@ -8,17 +8,16 @@ namespace Serein.Script.Node
{
/// <summary>
/// 赋值节点
/// 变量赋值节点
/// </summary>
public class AssignmentNode : ASTNode
{
/// <summary>
/// 变量名称
/// </summary>
//public string Variable { get; }
public ASTNode Target { get; }
/// <summary>
/// 对应的节点
/// 值来源
/// </summary>
public ASTNode Value { get; }

View File

@@ -14,7 +14,7 @@ namespace Serein.Script
/// <summary>
/// 定义的变量
/// </summary>
private Dictionary<string, object> _variables = new Dictionary<string, object>();
private Dictionary<string, object?> _variables = new Dictionary<string, object?>();
/// <summary>
/// 取消令牌源,用于控制脚本的执行

View File

@@ -13,4 +13,5 @@ namespace Serein.Script
Message = $"异常信息 : {message} ,代码在第{node.Row}行: {node.Code.Trim()}";
}
}
}

View File

@@ -10,6 +10,9 @@ using System.Threading.Tasks;
namespace Serein.Script
{
public class SereinScript
{
/// <summary>
@@ -47,7 +50,7 @@ namespace Serein.Script
}
Dictionary<ASTNode, Type> symbolInfos = TypeAnalysis.NodeSymbolInfos.ToDictionary();
SereinScriptInterpreter Interpreter = new SereinScriptInterpreter(symbolInfos);
return await Interpreter.InterpretAsync(context, programNode);
return await Interpreter.InterpreterAsync(context, programNode);
}

File diff suppressed because it is too large Load Diff

View File

@@ -198,7 +198,6 @@ namespace Serein.Script
this._index = token.StartIndex;
}
internal Token NextToken()
{
@@ -525,7 +524,6 @@ namespace Serein.Script
return ReadOnlySpan<char>.Empty;
}
public int GetIndex()
{
return _index;

View File

@@ -75,7 +75,6 @@ namespace Serein.Script
}
/// <summary>
/// 类型获取
/// </summary>
@@ -542,6 +541,8 @@ namespace Serein.Script
break;
case ObjectInstantiationNode objectInstantiationNode: // 类型实例化
break;
case CtorAssignmentNode ctorAssignmentNode:
break;
case ExpressionNode expressionNode: // 类型表达式(链式调用)
break;
case MemberAccessNode memberAccessNode: // 对象成员访问