mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
重写脚本解释器的实现,提高其可读性。
This commit is contained in:
17
Serein.Script/Node/ValueNode/BooleanNode.cs
Normal file
17
Serein.Script/Node/ValueNode/BooleanNode.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
/// <summary>
|
||||
/// 布尔字面量
|
||||
/// </summary>
|
||||
public class BooleanNode : ASTNode
|
||||
{
|
||||
public bool Value { get; }
|
||||
public BooleanNode(bool value) => Value = value;
|
||||
}
|
||||
}
|
||||
17
Serein.Script/Node/ValueNode/CharNode.cs
Normal file
17
Serein.Script/Node/ValueNode/CharNode.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
internal class CharNode : ASTNode
|
||||
{
|
||||
public char Value { get; }
|
||||
public CharNode(string value)
|
||||
{
|
||||
Value = char.Parse(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
15
Serein.Script/Node/ValueNode/NullNode.cs
Normal file
15
Serein.Script/Node/ValueNode/NullNode.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
/// <summary>
|
||||
/// Null节点
|
||||
/// </summary>
|
||||
public class NullNode : ASTNode
|
||||
{
|
||||
}
|
||||
}
|
||||
90
Serein.Script/Node/ValueNode/NumberNode.cs
Normal file
90
Serein.Script/Node/ValueNode/NumberNode.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
/// <summary>
|
||||
/// 数值型节点
|
||||
/// </summary>
|
||||
public abstract class NumberNode<T> : ASTNode where T : struct, IComparable<T>
|
||||
{
|
||||
public T Value { get; }
|
||||
public NumberNode(T value) => Value = value;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberIntNode(int vlaue) : NumberNode<int>(vlaue)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberLongNode(long vlaue) : NumberNode<long>(vlaue)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberFloatNode(float vlaue) : NumberNode<float>(vlaue)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberDoubleNode(double vlaue) : NumberNode<double>(vlaue)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberIntNode : ASTNode
|
||||
{
|
||||
public int Value { get; }
|
||||
public NumberIntNode(int value) => Value = value;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberLongNode : ASTNode
|
||||
{
|
||||
public long Value { get; }
|
||||
public NumberLongNode(long value) => Value = value;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberFloatNode : ASTNode
|
||||
{
|
||||
public float Value { get; }
|
||||
public NumberFloatNode(float value) => Value = value;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// int 整数型字面量
|
||||
/// </summary>
|
||||
public class NumberDoubleNode : ASTNode
|
||||
{
|
||||
public double Value { get; }
|
||||
public NumberDoubleNode(double value) => Value = value;
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
61
Serein.Script/Node/ValueNode/StringNode.cs
Normal file
61
Serein.Script/Node/ValueNode/StringNode.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
/// <summary>
|
||||
/// 字符串字面量节点
|
||||
/// </summary>
|
||||
public class StringNode : ASTNode
|
||||
{
|
||||
public string Value { get; }
|
||||
|
||||
public StringNode(string input)
|
||||
{
|
||||
// 使用 StringBuilder 来构建输出
|
||||
StringBuilder output = new StringBuilder(input.Length);
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
if (i < input.Length - 1 && input[i] == '\\') // 找到反斜杠
|
||||
{
|
||||
char nextChar = input[i + 1];
|
||||
|
||||
// 处理转义符
|
||||
switch (nextChar)
|
||||
{
|
||||
case 'r':
|
||||
output.Append('\r');
|
||||
i++; // 跳过 'r'
|
||||
break;
|
||||
case 'n':
|
||||
output.Append('\n');
|
||||
i++; // 跳过 'n'
|
||||
break;
|
||||
case 't':
|
||||
output.Append('\t');
|
||||
i++; // 跳过 't'
|
||||
break;
|
||||
case '\\': // 字面量反斜杠
|
||||
output.Append('\\');
|
||||
i++; // 跳过第二个 '\\'
|
||||
break;
|
||||
default:
|
||||
output.Append(input[i]); // 不是转义符,保留反斜杠
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
output.Append(input[i]); // 其他字符直接添加
|
||||
}
|
||||
}
|
||||
Value = output.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user