1. 移除了FlipflopContext,统一流程API

2. Script项目脚本修复了 RawString 原始字符串存在的问题
3. Script使用了ValueNode统一了值类型节点,为后续扩展更多的值类型做准备
4. TypeHelper.ToTypeOfString()方法中添加了部分值类型的"Type[]”与“List<Type>”的显式定义,用于脚本在类型中定义数组成员
5. Script项目脚本默认挂载的json方法拆分为jsonObj(String)与jsonStr(Object)以支持序列化与反序列化
6. 项目保存为dnf项目文件时,将不再保存名称为”Default"并且没有节点的画布,避免重复保存时默认画布增多。
This commit is contained in:
fengjiayi
2025-08-02 22:04:13 +08:00
parent 93747ce7fd
commit 79af278b70
26 changed files with 398 additions and 149 deletions

View File

@@ -1,4 +1,7 @@
namespace Serein.Script
using System.Data.Common;
using System.Numerics;
namespace Serein.Script
{
/// <summary>
/// Serein脚本词法分析器的Token类型
@@ -38,6 +41,10 @@
/// </summary>
String,
/// <summary>
/// 原始字符串(多行字符串)
/// </summary>
RawString,
/// <summary>
/// Char字符
/// </summary>
Char,
@@ -217,7 +224,7 @@
if (_input[_index + 1] == '"'
&& _input[_index + 2] == '"')
{
var value = _input.Slice(_index, 4).ToString();
//var value = _input.Slice(_index, 4).ToString();
// 原始字符串
return ReadRawString();
@@ -450,27 +457,38 @@
private Token ReadRawString()
{
// skip opening triple quotes
_index += 3;
var start = _index;
while (_index + 2 < _input.Length)
int startLine = _row;
_index += 3; // 跳过开头 """
int index = _index;
var contentStart = index;
while (index + 2 < _input.Length)
{
if (_input[_index] == '"' && _input[_index + 1] == '"' && _input[_index + 2] == '"')
char current = _input[index];
// 行号处理
if (current == '\n')
{
var value = _input.Slice(start, _index - start).ToString();
_index += 3; // skip closing """
return CreateToken(TokenType.String, value);
_row++;
}
// 检查是否是结束符 """
if (_input[index] != '"' || _input[index + 1] != '"' || _input[index + 2] != '"')
{
index++;
}
else
{
var value = _input.Slice(contentStart, index - contentStart).ToString();
_index += 3;
// 构建带行号信息的 Token假设 Token 有 StartLine 属性)
return CreateToken(TokenType.RawString, value);
}
_index++;
}
throw new Exception("Unterminated raw string literal");
throw new Exception($"Unterminated raw string literal starting at line {startLine}");
}
/// <summary>
/// 读取硬编码的文本
/// </summary>