重写脚本解释器的实现,提高其可读性。

This commit is contained in:
fengjiayi
2025-07-13 17:34:03 +08:00
parent 6141d2c1c1
commit 01ab905155
42 changed files with 1747 additions and 715 deletions

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.Script.Node.FlowControl
{
/// <summary>
/// 条件节点
/// </summary>
public class IfNode : ASTNode
{
/// <summary>
/// 条件来源
/// </summary>
public ASTNode Condition { get; }
/// <summary>
/// 条件为 true 时所执行的语句
/// </summary>
public List<ASTNode> TrueBranch { get; }
/// <summary>
/// 条件为 false 时所执行的语句
/// </summary>
public List<ASTNode> FalseBranch { get; }
public IfNode(ASTNode condition, List<ASTNode> trueBranch, List<ASTNode> falseBranch)
=> (Condition, TrueBranch, FalseBranch) = (condition, trueBranch, falseBranch);
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.Script.Node.FlowControl
{
/// <summary>
/// 程序入口
/// </summary>
public class ProgramNode : ASTNode
{
/// <summary>
/// 程序可执行的语句
/// </summary>
public List<ASTNode> Statements { get; }
public ProgramNode(List<ASTNode> statements)
{
Statements = statements;
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.Script.Node.FlowControl
{
/// <summary>
/// 返回值
/// </summary>
public class ReturnNode : ASTNode
{
/// <summary>
/// 返回值来源
/// </summary>
public ASTNode Value { get; }
public ReturnNode(ASTNode returnNode)
{
Value = returnNode;
}
public ReturnNode()
{
}
}
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.Script.Node.FlowControl
{
/// <summary>
/// 循环条件节点
/// </summary>
public class WhileNode : ASTNode
{
/// <summary>
/// 循环条件值来源
/// </summary>
public ASTNode Condition { get; }
/// <summary>
/// 循环中语句块
/// </summary>
public List<ASTNode> Body { get; }
public WhileNode(ASTNode condition, List<ASTNode> body) => (Condition, Body) = (condition, body);
}
}