修复了全局节点连接异常异常。

This commit is contained in:
fengjiayi
2025-07-29 14:25:31 +08:00
parent acb15c323e
commit 77160feaeb
66 changed files with 1719 additions and 1342 deletions

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace Serein.Script.Node
{
@@ -22,6 +23,13 @@ namespace Serein.Script.Node
public ASTNode Value { get; }
public AssignmentNode(ASTNode target, ASTNode value) => (Target, Value) = (target, value);
public override string ToString()
{
return $"{Target} = {Value}";
}
}

View File

@@ -33,5 +33,10 @@ namespace Serein.Script.Node
Operator = op;
Right = right;
}
public override string ToString()
{
return $"({Left} {Operator} {Right})";
}
}
}

View File

@@ -30,7 +30,11 @@ namespace Serein.Script.Node
this.ClassType = className;
}
public override string ToString()
{
var p = string.Join(",", Propertys.Select(p => $"{p.Value}"));
return $"{ClassType}({p})";
}
/* /// <summary>

View File

@@ -26,6 +26,12 @@ namespace Serein.Script.Node
this.Collection = Collection;
this.Index = indexValue;
}
public override string ToString()
{
return $"{Collection}[{Index}]";
}
}
/// <summary>
@@ -48,5 +54,10 @@ namespace Serein.Script.Node
this.Collection = collection;
this.Value = value;
}
public override string ToString()
{
return $"{Collection} = {Value}";
}
}
}

View File

@@ -41,6 +41,9 @@ namespace Serein.Script.Node
Value = value;
}
public override string ToString()
{
return $"ctor {Class}.{MemberName} = {Value}";
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
@@ -26,6 +27,12 @@ namespace Serein.Script.Node
FunctionName = functionName;
Arguments = arguments;
}
public override string ToString()
{
var p = string.Join(",", Arguments.Select(p => $"{p}"));
return $"{FunctionName}({p})";
}
}
}

View File

@@ -16,5 +16,11 @@ namespace Serein.Script.Node
/// </summary>
public string Name { get; }
public IdentifierNode(string name) => Name = name;
public override string ToString()
{
return $"let {Name}";
}
}
}

View File

@@ -26,5 +26,10 @@ namespace Serein.Script.Node
Object = obj;
MemberName = memberName;
}
public override string ToString()
{
return $"{Object}.{MemberName}";
}
}
}

View File

@@ -31,5 +31,10 @@ namespace Serein.Script.Node
MemberName = memberName;
Value = value;
}
public override string ToString()
{
return $"{Object}.{MemberName} = {Value}";
}
}
}

View File

@@ -32,5 +32,12 @@ namespace Serein.Script.Node
FunctionName = functionName;
Arguments = arguments;
}
public override string ToString()
{
var p = string.Join(",", Arguments.Select(p => $"{p}"));
return $"{Object}.{FunctionName}({p})";
}
}
}

View File

@@ -37,6 +37,13 @@ namespace Serein.Script.Node
CtorAssignments = ctorAssignments;
return this;
}
public override string ToString()
{
var arg = string.Join(",", Arguments.Select(p => $"{p}"));
var ctor_arg = string.Join(",", CtorAssignments.Select(p => $"{p}"));
return $"new {Type}({arg}){ctor_arg}";
}
}
}

View File

@@ -18,5 +18,9 @@ namespace Serein.Script.Node
TypeName = typeName;
}
public override string ToString()
{
return $"[type]{TypeName}";
}
}
}

View File

@@ -13,5 +13,10 @@ namespace Serein.Script.Node
{
public bool Value { get; }
public BooleanNode(bool value) => Value = value;
public override string ToString()
{
return $"{Value}";
}
}
}

View File

@@ -13,5 +13,9 @@ namespace Serein.Script.Node
{
Value = char.Parse(value);
}
public override string ToString()
{
return $"'{Value}'";
}
}
}

View File

@@ -11,5 +11,9 @@ namespace Serein.Script.Node
/// </summary>
public class NullNode : ASTNode
{
public override string ToString()
{
return $"Null";
}
}
}

View File

@@ -13,6 +13,11 @@ namespace Serein.Script.Node
{
public T Value { get; }
public NumberNode(T value) => Value = value;
public override string ToString()
{
return $"{Value}";
}
}

View File

@@ -55,6 +55,11 @@ namespace Serein.Script.Node
}
Value = output.ToString();
}
public override string ToString()
{
return $"\"{Value}\"";
}
}

View File

@@ -8,9 +8,6 @@ namespace Serein.Script
public class SereinScript
{
/// <summary>
/// 类型分析
/// </summary>

View File

@@ -1,21 +1,53 @@
namespace Serein.Script
{
/// <summary>
/// 脚本方法信息
/// </summary>
public class SereinScriptMethodInfo
{
/// <summary>
/// 类名
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 方法名
/// </summary>
public string MethodName { get; set; }
/// <summary>
/// 返回类型
/// </summary>
public Type? ReturnType { get; set; }
/// <summary>
/// 是否异步
/// </summary>
public bool IsAsync { get; set; }
/// <summary>
/// 入参参数信息
/// </summary>
public List<SereinScriptParamInfo> ParamInfos { get; set; }
/// <summary>
/// 对应的C#代码
/// </summary>
public string CsharpCode { get; set; }
/// <summary>
/// 入参信息
/// </summary>
public class SereinScriptParamInfo
{
/// <summary>
/// 入参参数名称
/// </summary>
public string ParamName { get; set; }
/// <summary>
/// 入参类型
/// </summary>
public Type ParameterType { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using Serein.Script.Node;
using Serein.Library.Utils;
using Serein.Script.Node;
using Serein.Script.Node.FlowControl;
using System.Text;
@@ -88,20 +89,38 @@ namespace Serein.Script
Indent();
if(param is null || param.Count == 0)
{
// 生成方法签名
AppendLine($"public static {returnContent} {mehtodName}()");
}
else
{
// 生成方法签名
AppendLine($"public static {returnContent} {mehtodName}({GetMethodParamster(param)})");
}
AppendLine( "{");
Indent();
foreach (var stmt in programNode.Statements)
// 生成变量节点
var idfNodesTemp = _symbolInfos.Keys.Where(key => key is IdentifierNode)
.OfType<IdentifierNode>().ToList() ;
var idfNodes = (param is null) switch
{
ConvertCode(stmt); // 递归遍历
true => idfNodesTemp.DistinctBy(n => n.Name).ToList(),
false => idfNodesTemp.DistinctBy(n => n.Name).DistinctByCondition(n => !param.ContainsKey(n.Name) ).ToList(),
};
foreach (var idf in idfNodes)
{
var varName = idf.Name;
var varType = _symbolInfos[idf];
AppendLine($"global::{varType.FullName} {varName} = default; // 变量");
}
AppendLine("");
// 递归遍历节点生成代码
foreach (var stmt in programNode.Statements)
{
ConvertCode(stmt);
Append(";");
}
if (_symbolInfos[programNode] == typeof(void))
{
AppendLine("");
@@ -192,8 +211,8 @@ namespace Serein.Script
void ConvertCodeOfIdentifierNode(IdentifierNode identifierNode)
{
var varName = identifierNode.Name;
if(_local.TryGetValue(varName, out var type))
Append(varName);
/*if (_local.TryGetValue(varName, out var type))
{
// 定义过,需要使用变量
Append(varName);
@@ -211,7 +230,7 @@ namespace Serein.Script
{
throw new Exception($"加载符号表时,无法匹配 IdentifierNode 节点的类型。 name {varName}");
}
}
}*/
}
ConvertCodeOfIdentifierNode(identifierNode);
break;
@@ -227,7 +246,6 @@ namespace Serein.Script
foreach(var item in ifNOde.TrueBranch)
{
ConvertCode(item);
//Append(";");
AppendLine(string.Empty);
}
Unindent();
@@ -235,10 +253,9 @@ namespace Serein.Script
AppendLine("else");
AppendLine("{");
Indent();
foreach (var item in ifNOde.TrueBranch)
foreach (var item in ifNOde.FalseBranch)
{
ConvertCode(item);
//Append(";");
AppendLine(string.Empty);
}
Unindent();

View File

@@ -198,7 +198,7 @@ namespace Serein.Script
var targetType = Analysis(assignmentNode.Target);
var valueType = Analysis (assignmentNode.Value);
if (!targetType.IsAssignableFrom(valueType))
throw new Exception($"索引类型不匹配:需要 {targetType},实际为 {valueType}");
throw new Exception($"赋值类型不匹配:需要 {targetType},实际为 {valueType}");
NodeSymbolInfos[assignmentNode.Value] = valueType;
NodeSymbolInfos[assignmentNode.Target] = valueType;
NodeSymbolInfos[assignmentNode] = typeof(void); // 赋值语句不产生类型