1645 lines
40 KiB
Markdown
1645 lines
40 KiB
Markdown
# Tree-sitter TSF 语法解析器
|
||
|
||
这个项目为你的 TSF 语言创建了一个 Tree-sitter 语法解析器,支持完整的 TSF 语法特性。
|
||
|
||
## ✨ 完整语法特性
|
||
|
||
### 1. 🗨️ 注释(3 种方式)
|
||
|
||
```tsf
|
||
// 行注释
|
||
{ 块注释1 }
|
||
(* 块注释2 *)
|
||
```
|
||
|
||
### 2. 🔢 数字格式
|
||
|
||
```tsf
|
||
// 基础数字
|
||
100
|
||
1.2232442
|
||
|
||
// 科学记数法
|
||
1E2
|
||
-3.4e34
|
||
2.4e-23
|
||
|
||
// 不同进制
|
||
0x1A // 十六进制
|
||
0b100 // 二进制
|
||
0o64 // 八进制
|
||
|
||
// 带符号数字
|
||
+123
|
||
-456.789
|
||
```
|
||
|
||
### 3. 📝 字符串和字面量
|
||
|
||
```tsf
|
||
// 字符串
|
||
'string0'
|
||
"string1"
|
||
"escaped \"quotes\" and \\backslashes"
|
||
|
||
// 特殊字面量
|
||
nil // 空值
|
||
-INF // 负无穷大
|
||
+INF // 正无穷大
|
||
NAN // 非数
|
||
false // 布尔false
|
||
true // 布尔true
|
||
```
|
||
|
||
### 4. 📊 数组构造(支持多层嵌套)
|
||
|
||
TSF 的数组语法使用 `array()` 构造函数,支持任意层级的嵌套:
|
||
|
||
#### 基础数组类型
|
||
|
||
```tsf
|
||
// 简单元素数组
|
||
array(1, 2, 3)
|
||
array("a", "b", "c")
|
||
array(1, "abc", true, nil)
|
||
|
||
// 键值对数组
|
||
array("key1": "value1", "key2": "value2")
|
||
array("name": "Alice", "age": 25, "active": true)
|
||
|
||
// 元组数组
|
||
array((1, "first"), (2, "second"), (3, "third"))
|
||
array(("id": 1, "name": "Alice"), ("id": 2, "name": "Bob"))
|
||
|
||
// 空数组
|
||
array()
|
||
```
|
||
|
||
#### 复杂嵌套示例
|
||
|
||
```tsf
|
||
// 多维数组
|
||
matrix := array(
|
||
array(1, 2, 3),
|
||
array(4, 5, 6),
|
||
array(7, 8, 9)
|
||
);
|
||
|
||
// 键值对嵌套
|
||
config := array(
|
||
"database": array(
|
||
"host": "localhost",
|
||
"port": 5432,
|
||
"tables": array("users", "products", "orders")
|
||
),
|
||
"cache": array(
|
||
"redis": array("host": "redis.local", "port": 6379),
|
||
"enabled": true
|
||
)
|
||
);
|
||
|
||
// 混合结构:键值对 + 元组 + 嵌套数组
|
||
complex_data := array(
|
||
"users": array(
|
||
("id": 1, "name": "Alice", "scores": array(85, 92, 78)),
|
||
("id": 2, "name": "Bob", "scores": array(91, 87, 95))
|
||
),
|
||
"metadata": array(
|
||
"total": 2,
|
||
"stats": array(
|
||
("mean": 88.5, "data": array(1, 2, 3)),
|
||
("max": 95, "data": (true, false, nil))
|
||
)
|
||
)
|
||
);
|
||
```
|
||
|
||
#### 数组访问和操作
|
||
|
||
```tsf
|
||
// 索引访问
|
||
item := arr[0];
|
||
value := matrix[1][2];
|
||
nested := config["database"]["tables"][0];
|
||
|
||
// 切片访问
|
||
slice := arr[1:5]; // 从索引1到4
|
||
head := arr[:3]; // 前3个元素
|
||
tail := arr[2:]; // 从索引2到末尾
|
||
|
||
// 数组赋值
|
||
arr[index] := new_value;
|
||
matrix[i][j] := data;
|
||
config["setting"] := "value";
|
||
```
|
||
|
||
### 5. ➕ 运算符
|
||
|
||
#### 算术运算符
|
||
|
||
```tsf
|
||
+ - * / % // 基本运算
|
||
+= -= /= *= // 复合赋值
|
||
++ -- // 自增自减(前缀和后缀)
|
||
mod // 取余(同%)
|
||
div // 除取整,如7 div 3 = 2
|
||
^ // 求幂,如2^3 = 8
|
||
~ // 求对数,8~2=3
|
||
! // 求导数,!A=1/A
|
||
```
|
||
|
||
**自增自减运算符说明:**
|
||
|
||
- **前缀自增自减**:`++a`, `--a` - 作为独立的自增自减语句
|
||
- **后缀自增自减**:`a++`, `a--` - 作为表达式语句使用
|
||
|
||
```tsf
|
||
function example();
|
||
begin
|
||
// 前缀自增自减语句
|
||
++counter;
|
||
--index;
|
||
|
||
// 后缀自增自减表达式语句
|
||
counter++;
|
||
index--;
|
||
|
||
// 在表达式中使用
|
||
result := ++a * 2; // 前缀:先自增,再使用
|
||
value := b++ * 2; // 后缀:先使用,再自增(作为表达式)
|
||
|
||
// 对象成员的自增自减
|
||
++obj.count; // 前缀语句
|
||
obj.count++; // 后缀表达式语句
|
||
end;
|
||
```
|
||
|
||
#### 字符串连接运算符
|
||
|
||
```tsf
|
||
$ // 万能连接符,可以连接任何类型
|
||
```
|
||
|
||
**$ 连接符示例:**
|
||
|
||
```tsf
|
||
// 基础连接
|
||
message := "Hello" $ " " $ "World"; // 结果: "Hello World"
|
||
info := "Count: " $ 42 $ " items"; // 结果: "Count: 42 items"
|
||
|
||
// 连接不同类型
|
||
status := "User " $ user_id $ " is " $ (is_active ? "active" : "inactive");
|
||
|
||
// 在表达式中使用
|
||
calculation := "Result: " $ (a + b) $ " = " $ result;
|
||
|
||
// 函数调用连接
|
||
log_entry := getTimestamp() $ ": " $ getMessage() $ " [" $ getLevel() $ "]";
|
||
|
||
// 对象属性连接
|
||
full_name := person.firstName $ " " $ person.lastName;
|
||
|
||
// raise语句中使用
|
||
raise "Error " $ error_code $ ": " $ error_message;
|
||
|
||
// echo语句中使用
|
||
echo "Processing " $ current_index $ " of " $ total_count $ " items";
|
||
```
|
||
|
||
#### 矩阵运算符
|
||
|
||
```tsf
|
||
` // 矩阵转置(前缀)
|
||
| // 矩阵列连接
|
||
Union // 矩阵行连接
|
||
:| // 非完全矩阵列连接
|
||
! // 矩阵求逆与广义逆(前缀)
|
||
:* // 矩阵乘法
|
||
:\\ // 矩阵左除
|
||
:^ // 矩阵乘方
|
||
```
|
||
|
||
**矩阵运算符示例:**
|
||
|
||
```tsf
|
||
// 矩阵转置(前缀)
|
||
A := array((1,2,3),(4,5,6)); // 2x3矩阵
|
||
B := `A; // 转置为3x2矩阵: ((1,4),(2,5),(3,6))
|
||
|
||
// 矩阵列连接
|
||
matrix1 := array((1,2),(3,4)); // 2x2矩阵
|
||
matrix2 := array((5,6),(7,8)); // 2x2矩阵
|
||
combined := matrix1 | matrix2; // 2x4矩阵: ((1,2,5,6),(3,4,7,8))
|
||
|
||
// 矩阵行连接
|
||
row_combined := matrix1 Union matrix2; // 4x2矩阵
|
||
|
||
// 矩阵求逆(前缀)
|
||
identity := !A; // A的逆矩阵
|
||
|
||
// 矩阵乘法
|
||
result := matrix1 :* matrix2; // 矩阵乘法
|
||
|
||
// 矩阵左除
|
||
solution := A :\\ b; // 求解线性方程组 Ax = b
|
||
|
||
// 矩阵乘方
|
||
power_matrix := A :^ 3; // A的3次幂
|
||
|
||
// 复杂矩阵运算组合(前缀转置)
|
||
complex_result := `(A :* B) | (C Union D);
|
||
|
||
// 嵌套转置运算
|
||
double_transpose := ``A; // 转置的转置,等于原矩阵
|
||
mixed_ops := `(!A) :* B; // 先求逆,再转置,然后矩阵乘法
|
||
```
|
||
|
||
#### 集合运算符
|
||
|
||
```tsf
|
||
union // 集合并集
|
||
union2 // 集合并集2
|
||
minus // 集合差集
|
||
intersect // 集合交集
|
||
```
|
||
|
||
**集合运算符示例:**
|
||
|
||
```tsf
|
||
// 集合定义
|
||
setA := array(1, 2, 3, 4, 5);
|
||
setB := array(4, 5, 6, 7, 8);
|
||
setC := array(2, 4, 6, 8, 10);
|
||
|
||
// 集合并集
|
||
union_result := setA union setB; // 结果: array(1,2,3,4,5,6,7,8)
|
||
|
||
// 集合并集2(可能有不同的语义)
|
||
union2_result := setA union2 setB;
|
||
|
||
// 集合差集
|
||
diff_result := setA minus setB; // 结果: array(1,2,3)
|
||
|
||
// 集合交集
|
||
intersect_result := setA intersect setB; // 结果: array(4,5)
|
||
|
||
// 复杂集合运算
|
||
complex_set := (setA union setB) intersect setC; // ((A∪B)∩C)
|
||
|
||
// 集合复合赋值
|
||
setA union= setB; // setA = setA union setB
|
||
setA minus= setC; // setA = setA minus setC
|
||
setA intersect= setB; // setA = setA intersect setB
|
||
|
||
// 对象成员的集合运算
|
||
obj.values union= new_values;
|
||
data.items intersect= valid_items;
|
||
```
|
||
|
||
#### 复合赋值运算符(扩展)
|
||
|
||
```tsf
|
||
+= -= *= /= // 基础算术复合赋值
|
||
union= // 集合并集复合赋值
|
||
union2= // 集合并集2复合赋值
|
||
minus= // 集合差集复合赋值
|
||
intersect= // 集合交集复合赋值
|
||
```
|
||
|
||
#### 逻辑运算符
|
||
|
||
```tsf
|
||
.&& and // 与
|
||
.|| or // 或
|
||
.!! not // 非
|
||
```
|
||
|
||
#### 位运算符
|
||
|
||
```tsf
|
||
.& // 位与
|
||
.| // 位或
|
||
.! // 位非
|
||
.^ // 位异或
|
||
shl // 位左移
|
||
rol // 左循环移位
|
||
shr // 位右移
|
||
ror // 右循环移位
|
||
```
|
||
|
||
#### 比较运算符
|
||
|
||
```tsf
|
||
= // 等于
|
||
<> // 不等于
|
||
< > <= >= // 大小比较
|
||
```
|
||
|
||
#### 三元条件运算符
|
||
|
||
```tsf
|
||
// 基本三元表达式
|
||
result := condition ? value_if_true : value_if_false;
|
||
|
||
// 实际示例
|
||
max := a > b ? a : b;
|
||
status := age >= 18 ? "adult" : "minor";
|
||
price := isMember ? originalPrice * 0.8 : originalPrice;
|
||
|
||
// 嵌套三元表达式
|
||
grade := score >= 90 ? "A" :
|
||
score >= 80 ? "B" :
|
||
score >= 70 ? "C" : "F";
|
||
|
||
// 在数组中使用
|
||
data := array(
|
||
condition1 ? "option1" : "default1",
|
||
condition2 ? array(1, 2, 3) : array(),
|
||
x > 0 ? (positive_val, "positive") : (negative_val, "negative")
|
||
);
|
||
```
|
||
|
||
### 6. 📦 变量声明
|
||
|
||
```tsf
|
||
a := nil; // 普通赋值
|
||
const ca = 123; // 常量声明
|
||
global ga := array(1, 2, 3); // 全局变量声明+初始化
|
||
global ga1; // 只声明全局变量
|
||
```
|
||
|
||
### 7. 📤 解包(Destructuring)赋值
|
||
|
||
```tsf
|
||
// 基础数组解包
|
||
[a, b, c] := array(1, 2, 3); // a=1, b=2, c=3
|
||
|
||
// 函数返回值解包
|
||
[x, y] := getCoordinates(); // 解包函数返回的数组
|
||
[name, age, email] := getUserInfo(user_id); // 解包用户信息
|
||
|
||
// 嵌套数组解包
|
||
[first, second, third] := matrix[0]; // 解包矩阵第一行
|
||
[user_data] := config["users"][0]; // 解包配置中的用户数据
|
||
|
||
// 复杂表达式解包
|
||
[min_val, max_val] := calculateRange(data); // 解包计算结果
|
||
[status, message, data] := processRequest(); // 解包处理结果
|
||
|
||
// 在函数中使用解包
|
||
function processUserData();
|
||
begin
|
||
[id, name, age, scores] := getUserById(123);
|
||
|
||
// 处理解包后的数据
|
||
if age >= 18 then
|
||
echo "Adult user: " $ name $ " (ID: " $ id $ ")";
|
||
|
||
// 解包嵌套数据
|
||
[math, english, science] := scores;
|
||
average := (math + english + science) / 3;
|
||
|
||
return array("name": name, "average": average);
|
||
end;
|
||
```
|
||
|
||
### 8. 🔀 条件语句
|
||
|
||
```tsf
|
||
// if语句
|
||
if aaa then
|
||
begin
|
||
// 代码块
|
||
end
|
||
else if bbb then
|
||
begin
|
||
// 代码块
|
||
end
|
||
else begin
|
||
// 代码块
|
||
end
|
||
|
||
// 单行if语句
|
||
if condition then statement;
|
||
if x > 0 then result := x;
|
||
|
||
// case语句
|
||
case age of
|
||
10: println("10");
|
||
11,12: begin
|
||
println("11,12");
|
||
end
|
||
else
|
||
println("case default");
|
||
end;
|
||
```
|
||
|
||
### 9. 🔄 循环语句
|
||
|
||
```tsf
|
||
// for...in 循环
|
||
for k,v in data do
|
||
begin
|
||
if v = "c" then continue;
|
||
process(k, v);
|
||
end;
|
||
|
||
// for...to 循环(递增)
|
||
for i:=0 to length(data) do
|
||
begin
|
||
if i = 10 then break;
|
||
process(data[i]);
|
||
end
|
||
|
||
// for...downto 循环(递减)
|
||
for i:=100 downto 0 do
|
||
println(i);
|
||
|
||
// while 循环
|
||
while condition do
|
||
begin
|
||
// 代码块
|
||
end;
|
||
|
||
// repeat...until 循环
|
||
a := 1;
|
||
repeat
|
||
a++;
|
||
until a > 10;
|
||
return a;
|
||
```
|
||
|
||
### 10. 🎛️ 控制流
|
||
|
||
```tsf
|
||
break; // 跳出循环
|
||
continue; // 继续下一次循环
|
||
return value; // 返回值
|
||
return; // 无返回值返回
|
||
```
|
||
|
||
### 11. 🔑 关键字语句
|
||
|
||
TSF 提供了一些专用的关键字语句,用于特定的操作。
|
||
|
||
#### Echo 语句 - 输出打印
|
||
|
||
```tsf
|
||
// 输出多个值(用逗号分隔)
|
||
echo "Hello", " ", "World"; // 输出:Hello World
|
||
echo "Value: ", x, " Type: ", type; // 输出多个值
|
||
echo "Count:", count + 1, func(); // 表达式和函数调用
|
||
|
||
// 输出单个值
|
||
echo variable; // 输出单个变量
|
||
echo "Simple message"; // 输出字符串
|
||
echo array(1, 2, 3); // 输出数组
|
||
|
||
// 配合$连接符使用
|
||
echo "Processing " $ current_index $ " of " $ total_count $ " items";
|
||
echo "User " $ user_name $ " logged in at " $ timestamp;
|
||
```
|
||
|
||
#### Raise 语句 - 异常抛出
|
||
|
||
```tsf
|
||
// 基本异常抛出
|
||
raise "Error message"; // 抛出字符串消息
|
||
raise error_variable; // 抛出变量值
|
||
raise getErrorMessage(); // 抛出函数返回值
|
||
|
||
// 使用表达式
|
||
raise "Error: " + error_code; // 字符串拼接
|
||
raise "Error code " $ error_code $ " occurred"; // 使用$连接符
|
||
|
||
// 复杂异常消息构建
|
||
raise "User " $ user_id $ " permission denied at " $ getTimestamp();
|
||
raise "Invalid input: expected " $ expected_type $ ", got " $ actual_type;
|
||
|
||
// 条件性异常抛出
|
||
if invalid_input then
|
||
raise "Invalid input provided";
|
||
|
||
if data = nil then
|
||
raise "Data cannot be nil";
|
||
```
|
||
|
||
### 12. 🔍 判断语法
|
||
|
||
TSF 提供了专门的判断语法,用于类型检查和成员检查。
|
||
|
||
#### is class() - 类型判断
|
||
|
||
```tsf
|
||
// 基础类型判断
|
||
obj is class(MyClass) // 判断obj是否是MyClass的实例
|
||
instance is class(Person) // 判断instance是否是Person类型
|
||
data is class(Array) // 判断data是否是Array类型
|
||
|
||
// 使用qualified identifier
|
||
obj is class(namespace.ClassName) // 带命名空间的类名
|
||
instance is class(mymodule.Person) // 模块中的类
|
||
|
||
// 在条件语句中使用
|
||
if obj is class(Person) then
|
||
echo "This is a Person object";
|
||
else
|
||
echo "Not a Person object";
|
||
|
||
// 在三元表达式中使用
|
||
type_name := obj is class(Person) ? "Person" : "Other";
|
||
message := data is class(Array) ? "Array data" : "Non-array data";
|
||
```
|
||
|
||
#### in - 成员检查
|
||
|
||
```tsf
|
||
// 基础成员检查
|
||
1 in array(1, 2, 3) // 检查数字是否在数组中
|
||
"apple" in array("apple", "banana") // 检查字符串是否在数组中
|
||
item in my_array // 检查元素是否在变量数组中
|
||
|
||
// 复杂表达式检查
|
||
(x + y) in valid_values // 表达式结果检查
|
||
user.id in authorized_ids // 对象属性检查
|
||
getValue() in allowed_values // 函数返回值检查
|
||
|
||
// 嵌套数组检查
|
||
target in data["items"]["list"] // 检查嵌套数组成员
|
||
item in config["allowed"]["types"] // 配置数组检查
|
||
|
||
// 在条件语句中使用
|
||
if value in valid_values then
|
||
echo "Value is valid";
|
||
else
|
||
raise "Invalid value: " $ value;
|
||
```
|
||
|
||
### 13. 📝 表达式语句
|
||
|
||
TSF 支持将表达式作为独立的语句使用,这在函数调用和计算中非常有用:
|
||
|
||
```tsf
|
||
function example();
|
||
begin
|
||
// 表达式语句 - 函数调用
|
||
func();
|
||
obj.method();
|
||
|
||
// 表达式语句 - 自增自减(后缀)
|
||
counter++;
|
||
index--;
|
||
obj.value++;
|
||
|
||
// 表达式语句 - 数学运算(可能有副作用)
|
||
x + y;
|
||
a * b + c;
|
||
|
||
// 表达式语句 - 矩阵运算
|
||
`matrix; // 转置操作(前缀)
|
||
matrix1 :* matrix2; // 矩阵乘法
|
||
|
||
// 表达式语句 - 集合运算
|
||
setA union setB;
|
||
|
||
// 表达式语句 - 三元条件
|
||
condition ? action1() : action2();
|
||
|
||
// 表达式语句 - 复杂嵌套
|
||
obj.method().getValue() + process(data);
|
||
end;
|
||
```
|
||
|
||
### 14. 🔧 函数定义
|
||
|
||
```tsf
|
||
// 参数不指定类型(用逗号分隔)
|
||
function syntax_func(a, b);
|
||
begin
|
||
// 函数体
|
||
end
|
||
|
||
// 参数指定类型(用分号分隔)
|
||
function syntax_func(a: real; b: array of string);
|
||
begin
|
||
// 函数体
|
||
end;
|
||
|
||
// 参数带默认值(用分号分隔)
|
||
function syntax_func(a: real = 1.0; c: string = "123")
|
||
begin
|
||
var1 := 123;
|
||
end;
|
||
|
||
// 参数带默认值但无类型
|
||
function syntax_func(a = 1; b = 2)
|
||
begin
|
||
// 函数体
|
||
end
|
||
|
||
// 返回类型
|
||
function calculate(x: real; y: real): real;
|
||
begin
|
||
return x + y;
|
||
end;
|
||
```
|
||
|
||
### 15. 📞 函数调用
|
||
|
||
```tsf
|
||
// 无参数调用
|
||
test();
|
||
|
||
// 带参数调用
|
||
func(arg1, arg2);
|
||
println("{} == {}", k, ret);
|
||
|
||
// 链式调用
|
||
obj.method1().method2().method3();
|
||
|
||
// 嵌套调用
|
||
result := outer_func(inner_func(param));
|
||
```
|
||
|
||
#### 函数指针调用
|
||
|
||
TSF 支持函数指针的调用,使用 `##` 语法来调用通过指针引用的函数。
|
||
|
||
```tsf
|
||
// 函数指针调用语法
|
||
##pointer_func(param1, param2);
|
||
|
||
// 实际使用示例
|
||
function add(a: integer; b: integer): integer;
|
||
begin
|
||
return a + b;
|
||
end;
|
||
|
||
function multiply(a: integer; b: integer): integer;
|
||
begin
|
||
return a * b;
|
||
end;
|
||
|
||
function processWithCallback(x: integer; y: integer; callback_ptr);
|
||
begin
|
||
// 使用函数指针调用
|
||
result := ##callback_ptr(x, y);
|
||
echo "Callback result: " $ result;
|
||
return result;
|
||
end;
|
||
|
||
function demonstrateFunctionPointers();
|
||
begin
|
||
// 获取函数指针
|
||
add_ptr := @add; // 获取add函数的指针
|
||
mul_ptr := @multiply; // 获取multiply函数的指针
|
||
|
||
// 直接调用函数指针
|
||
sum := ##add_ptr(5, 3); // 等价于 add(5, 3)
|
||
product := ##mul_ptr(4, 6); // 等价于 multiply(4, 6)
|
||
|
||
echo "Sum: " $ sum; // 输出: Sum: 8
|
||
echo "Product: " $ product; // 输出: Product: 24
|
||
|
||
// 将函数指针作为参数传递
|
||
result1 := processWithCallback(10, 20, add_ptr);
|
||
result2 := processWithCallback(10, 20, mul_ptr);
|
||
|
||
return array("sum": result1, "product": result2);
|
||
end;
|
||
|
||
// 函数指针数组的使用
|
||
function useFunctionPointerArray();
|
||
begin
|
||
// 创建函数指针数组
|
||
operations := array(@add, @multiply);
|
||
|
||
// 通过数组索引调用函数指针
|
||
for i := 0 to length(operations) - 1 do
|
||
begin
|
||
operation := operations[i];
|
||
result := ##operation(7, 3);
|
||
echo "Operation " $ i $ " result: " $ result;
|
||
end;
|
||
|
||
return operations;
|
||
end;
|
||
```
|
||
|
||
**函数指针调用特性:**
|
||
|
||
- **调用语法**:`##pointer_name(arguments)`
|
||
- **指针获取**:使用 `@function_name` 获取函数指针
|
||
- **参数传递**:支持任意数量和类型的参数
|
||
- **返回值**:函数指针调用可以有返回值
|
||
- **动态调用**:可以在运行时决定调用哪个函数
|
||
- **方法指针**:支持对象方法的指针调用
|
||
- **数组存储**:函数指针可以存储在数组中进行批量操作
|
||
|
||
### 16. 🏗️ 类系统
|
||
|
||
#### 基础类声明
|
||
|
||
```tsf
|
||
// 声明一个简单的类
|
||
type Base = class
|
||
end; // 分号可有可无
|
||
|
||
// 继承一个类
|
||
type Child = class(Base)
|
||
end
|
||
```
|
||
|
||
#### 成员变量声明
|
||
|
||
```tsf
|
||
type MyClass = class
|
||
public
|
||
member1; // 直接声明
|
||
private
|
||
member2: string; // 有类型的声明
|
||
protected
|
||
[weakref]member3; // 有[tag]的声明,weakref表示弱引用
|
||
[weakref]member4: obj; // 带类型和标签的声明
|
||
end;
|
||
```
|
||
|
||
#### 方法声明
|
||
|
||
```tsf
|
||
type MyClass = class
|
||
public
|
||
// 构造和析构方法
|
||
function Create(); // 默认构造方法
|
||
function Destroy(); // 默认析构方法
|
||
|
||
// 类内实现的方法
|
||
function GetValue();
|
||
begin
|
||
return member1;
|
||
end
|
||
|
||
// 只声明的方法(类外实现)
|
||
function Process(data: string);
|
||
|
||
// 带修饰符的方法
|
||
function VirtualFunc();virtual; // 虚方法
|
||
function OverloadFunc();overload; // 重载方法
|
||
function OverloadFunc(a: integer);overload; // 重载方法
|
||
private
|
||
member1: integer;
|
||
end;
|
||
```
|
||
|
||
#### 操作符重载
|
||
|
||
TSF 支持类的操作符重载,允许自定义类如何响应特定的操作符。
|
||
|
||
```tsf
|
||
type MyClass = class
|
||
public
|
||
// 构造函数
|
||
function Create();
|
||
|
||
// 操作符重载声明
|
||
function operator[](index: integer); // 数组访问操作符重载
|
||
function operator+(other: MyClass); // 加法操作符重载
|
||
function operator=(other: MyClass); // 赋值操作符重载
|
||
function operator<>(other: MyClass); // 不等于操作符重载
|
||
function operator*(other: MyClass); // 乘法操作符重载
|
||
|
||
// 类内实现的操作符重载
|
||
function operator++(); // 前缀自增操作符重载
|
||
begin
|
||
value := value + 1;
|
||
return self;
|
||
end
|
||
|
||
private
|
||
value: integer;
|
||
data: array of string;
|
||
end;
|
||
```
|
||
|
||
**类外操作符重载实现:**
|
||
|
||
```tsf
|
||
// 类外实现操作符重载
|
||
function operator MyClass.[](index: integer);
|
||
begin
|
||
if index >= 0 and index < length(data) then
|
||
return data[index]
|
||
else
|
||
raise "Index out of bounds: " $ index;
|
||
end;
|
||
|
||
function operator MyClass.+(other: MyClass);
|
||
begin
|
||
result := new MyClass();
|
||
result.value := self.value + other.value;
|
||
return result;
|
||
end;
|
||
|
||
function operator MyClass.=(other: MyClass);
|
||
begin
|
||
return self.value = other.value;
|
||
end;
|
||
|
||
function operator MyClass.*(other: MyClass);
|
||
begin
|
||
result := new MyClass();
|
||
result.value := self.value * other.value;
|
||
return result;
|
||
end;
|
||
```
|
||
|
||
**操作符重载使用示例:**
|
||
|
||
```tsf
|
||
function testOperatorOverloading();
|
||
begin
|
||
// 创建对象
|
||
obj1 := new MyClass();
|
||
obj2 := new MyClass();
|
||
|
||
// 使用重载的操作符
|
||
item := obj1[0]; // 调用 operator[]
|
||
sum := obj1 + obj2; // 调用 operator+
|
||
product := obj1 * obj2; // 调用 operator*
|
||
|
||
// 比较操作符
|
||
if obj1 = obj2 then // 调用 operator=
|
||
echo "Objects are equal";
|
||
|
||
if obj1 <> obj2 then // 调用 operator<>
|
||
echo "Objects are not equal";
|
||
|
||
// 自增操作符
|
||
++obj1; // 调用 operator++
|
||
|
||
return sum;
|
||
end;
|
||
```
|
||
|
||
**支持的操作符重载:**
|
||
|
||
- **数组访问**:`[]`
|
||
- **算术运算**:`+` `-` `*` `/` `%` `^`
|
||
- **比较运算**:`=` `<>` `<` `>` `<=` `>=`
|
||
- **自增自减**:`++` `--`
|
||
- **赋值运算**:`:=`
|
||
- **其他运算**:根据需要可以重载更多操作符
|
||
|
||
#### 类外方法实现
|
||
|
||
```tsf
|
||
// 类外实现方法
|
||
function MyClass.Create();
|
||
begin
|
||
member1 := 123;
|
||
end;
|
||
|
||
function MyClass.Process(data: string);
|
||
begin
|
||
result := data + " processed";
|
||
end;
|
||
|
||
// 带修饰符的类外实现
|
||
function MyClass.VirtualFunc();virtual;
|
||
begin
|
||
// 虚方法实现
|
||
end;
|
||
```
|
||
|
||
### 17. 🆕 对象创建和成员访问
|
||
|
||
#### 对象创建
|
||
|
||
```tsf
|
||
// 创建无参数对象
|
||
obj := new MyClass();
|
||
|
||
// 创建带参数对象
|
||
obj := new MyClass(param1, param2);
|
||
|
||
// 使用限定名称创建对象
|
||
obj := new package.MyClass();
|
||
|
||
// 创建对象并立即使用
|
||
result := new Calculator().add(1, 2);
|
||
```
|
||
|
||
#### 成员访问和操作
|
||
|
||
```tsf
|
||
// 成员访问
|
||
value := obj.property;
|
||
nested_value := obj.nested.property;
|
||
|
||
// 成员赋值
|
||
obj.property := 123;
|
||
obj.nested.value := "test";
|
||
|
||
// 方法调用
|
||
obj.method();
|
||
result := obj.calculate(10, 20);
|
||
|
||
// 链式调用
|
||
result := obj.method1().method2().getValue();
|
||
|
||
// 成员自增自减
|
||
obj.count++;
|
||
++obj.value;
|
||
|
||
// 成员复合赋值
|
||
obj.value += 10;
|
||
obj.score *= 1.1;
|
||
|
||
// 成员数组访问
|
||
item := obj.data[index];
|
||
obj.array[i] := new_value;
|
||
```
|
||
|
||
### 18. 📦 Unit(模块)系统
|
||
|
||
#### Unit 声明语法
|
||
|
||
```tsf
|
||
unit UnitName; // unit 声明,分号必须
|
||
|
||
interface // 对外接口部分
|
||
// 公开的变量、常量和函数声明
|
||
|
||
implementation // 实现部分
|
||
// 私有变量、常量和函数实现
|
||
|
||
initialization // 初始化部分(可选)
|
||
// 单元加载时执行的代码
|
||
|
||
finalization // 析构部分(可选)
|
||
// 单元卸载时执行的代码
|
||
|
||
end. // 结束标记,点号必须
|
||
```
|
||
|
||
#### 使用 Unit
|
||
|
||
```tsf
|
||
uses UnitName; // 引入单个单元
|
||
uses Unit1, Unit2, Unit3; // 引入多个单元
|
||
```
|
||
|
||
#### 完整 Unit 示例
|
||
|
||
```tsf
|
||
unit DeMo_Unit_Test01;
|
||
|
||
interface
|
||
var Ua, Ub;
|
||
const CS = 888;
|
||
function addv();
|
||
function NumbJO(v);
|
||
function print();
|
||
|
||
implementation
|
||
const CN = array("奇数", "偶数");
|
||
var Uc;
|
||
|
||
function print();
|
||
begin
|
||
echo "当前值-Ua:", Ua, " Ub:", Ub, " Uc:", Uc, " CS:", CS;
|
||
end
|
||
|
||
function addv();
|
||
begin
|
||
Ua += 10;
|
||
Uc += 1;
|
||
end;
|
||
|
||
function NumbJO(v);
|
||
begin
|
||
if (v mod 2) = 0 then
|
||
echo v, "是一个", CN[1];
|
||
else
|
||
echo v, "是一个", CN[0];
|
||
end;
|
||
|
||
initialization
|
||
Ua := 100;
|
||
Ub := "Tinysoft Unit";
|
||
Uc := 1;
|
||
|
||
finalization
|
||
echo "DeMo_Unit_Test01 End.";
|
||
|
||
end.
|
||
```
|
||
|
||
### 19. 🔍 数组索引和切片访问
|
||
|
||
```tsf
|
||
// 基础索引访问
|
||
item := arr[0];
|
||
value := matrix[i][j];
|
||
|
||
// 嵌套数组访问
|
||
user := data["users"][0];
|
||
score := user["scores"][1];
|
||
|
||
// 切片访问
|
||
slice := arr[1:5]; // 从索引1到4
|
||
head := arr[:3]; // 前3个元素
|
||
tail := arr[2:]; // 从索引2到末尾
|
||
|
||
// 复杂嵌套访问
|
||
nested_value := config["database"]["settings"]["cache"]["ttl"];
|
||
|
||
// 函数返回值的数组访问
|
||
first_item := getData()[0];
|
||
user_name := getUsers()[index]["name"];
|
||
|
||
// 对象方法链式访问
|
||
value := obj.getArray().slice(0, 5)[2];
|
||
```
|
||
|
||
### 20 TSL SELECT 语法
|
||
|
||
TSL 语言支持类似 SQL 的查询语法,但有其独特的特性和扩展。主要特点包括:
|
||
|
||
与标准 SQL 的主要区别
|
||
|
||
- 语句以 `end` 结束,而非分号
|
||
- 字段访问必须使用 `[字段名]` 格式
|
||
- 不支持 `TOP N`,但支持更灵活的 `DRANGE`
|
||
- 聚集函数名称添加 `of` 后缀(如 `countof`, `avgof`)
|
||
- 支持矩阵和数组操作
|
||
- 大小写敏感的字段名
|
||
|
||
#### 基本语法
|
||
|
||
- 通用语法结构
|
||
|
||
```sql
|
||
SELECT/UPDATE/DELETE/INSERT ... END;
|
||
```
|
||
|
||
- 字段访问方式
|
||
- 单表访问:`["字段名"]`
|
||
- 多表访问:`[表序号].["字段名"]`(表序号从 1 开始)
|
||
- 整数下标访问:`[0]`(访问第 0 列)
|
||
|
||
#### SELECT 语句
|
||
|
||
##### select 基本语法
|
||
|
||
```sql
|
||
SELECT [选项] [DISTINCT] [DRANGE(范围)]
|
||
<选择列表>
|
||
FROM <数据源>
|
||
[WHERE <条件>]
|
||
[GROUP BY <分组表达式>]
|
||
[HAVING <分组条件>]
|
||
[ORDER BY <排序表达式>]
|
||
END;
|
||
```
|
||
|
||
#### SELECT 的变体
|
||
|
||
1. **SELECT** - 返回二维数组(默认)
|
||
2. **SSELECT** - 返回一维数组
|
||
3. **VSELECT** - 返回单个值
|
||
4. **MSELECT** - 返回 Matrix 类型(内存优化)
|
||
|
||
##### SELECTOPT 选项
|
||
|
||
| 选项名 | 值 | 含义 |
|
||
| ---------------------- | --- | -------------------- |
|
||
| SELECT_OPT_SINGLEV | 1 | 返回单个值 |
|
||
| SELECT_OPT_SINGLEARRAY | 2 | 返回一维数组 |
|
||
| SELECT_OPT_MATRIX | 4 | 返回 Matrix 类型 |
|
||
| SELECT_OPT_PACKED | 8 | 行列下标为递增数字 |
|
||
| SELECT_OPT_AGGSAMENAME | 32 | 聚集函数保持原字段名 |
|
||
|
||
##### 选择列表语法
|
||
|
||
- `*` - 返回所有列
|
||
- `["字段名"]` - 返回指定列
|
||
- `表达式 AS "别名"` - 带别名的表达式
|
||
- `StartIndex TO EndIndex` - 返回指定范围的列
|
||
|
||
#### DRANGE 用法
|
||
|
||
1. **范围选择**:`DRANGE(0 TO 9)` - 返回第 0 到第 9 条记录
|
||
2. **负数索引**:`DRANGE(-10 TO -1)` - 返回最后 10 条记录
|
||
3. **等分选择**:`DRANGE(1 OF 10)` - 返回 10 等分中的第 1 份
|
||
|
||
#### WHERE 子句
|
||
|
||
```sql
|
||
WHERE ["字段名"] > 85
|
||
WHERE ["英语成绩"] > 85 AND ["数学成绩"] > 90
|
||
```
|
||
|
||
#### ORDER BY 子句
|
||
|
||
```sql
|
||
ORDER BY ["成绩"] DESC
|
||
ORDER BY ["语文成绩"] ASC, ["英语成绩"]/["语文成绩"] DESC
|
||
```
|
||
|
||
#### GROUP BY 子句
|
||
|
||
```sql
|
||
GROUP BY ["性别"]
|
||
GROUP BY ["性别"], groupfunc(["英语成绩"])
|
||
```
|
||
|
||
#### HAVING 子句
|
||
|
||
```sql
|
||
HAVING CountOf(*) > 1
|
||
HAVING AvgOf(["成绩"]) > 80
|
||
```
|
||
|
||
#### UPDATE 语句
|
||
|
||
##### update 基本语法
|
||
|
||
```sql
|
||
UPDATE <表名>
|
||
SET ["字段1"] = 值1, ["字段2"] = 值2
|
||
[WHERE <条件>]
|
||
END;
|
||
```
|
||
|
||
```sql
|
||
-- 更新单个字段
|
||
UPDATE B SET ["英语成绩"] = 79 WHERE ["学号"] = "03" END;
|
||
|
||
-- 更新多个字段
|
||
UPDATE B SET ["英语成绩"] = 79, ["语文成绩"] = 80 WHERE ["学号"] = "03" END;
|
||
|
||
-- 基于计算的更新
|
||
UPDATE B SET ["英语成绩"] = sqrt(["英语成绩"]) * 10 END;
|
||
|
||
-- 使用ThisRow更新整行
|
||
UPDATE R SET ThisRow = DATA WHERE ["学号"] = DATA["学号"] END;
|
||
```
|
||
|
||
#### DELETE 语句
|
||
|
||
##### delete 基本语法
|
||
|
||
```sql
|
||
DELETE FROM <表名>
|
||
[WHERE <条件>]
|
||
END;
|
||
```
|
||
|
||
```sql
|
||
-- 删除指定记录
|
||
DELETE FROM A WHERE ["学号"] = "01" END;
|
||
|
||
-- 删除所有记录
|
||
DELETE FROM A END;
|
||
|
||
-- 使用ThisRow条件
|
||
DELETE FROM R WHERE Sum(ThisRow * ThisRow) = 0 END;
|
||
```
|
||
|
||
#### INSERT 语句
|
||
|
||
##### insert 基本语法
|
||
|
||
```sql
|
||
-- 插入单行(按列顺序)
|
||
INSERT INTO <表名> VALUES (值1, 值2, ...);
|
||
|
||
-- 插入单行(指定字段)
|
||
INSERT INTO <表名> INSERTFIELDS(["字段1"], ["字段2"]) VALUES (值1, 值2);
|
||
|
||
-- 批量插入
|
||
INSERT INTO <表名> <数据数组>;
|
||
```
|
||
|
||
```sql
|
||
-- 按顺序插入
|
||
INSERT INTO A VALUES("06", "路人甲") END;
|
||
|
||
-- 指定字段插入
|
||
INSERT INTO A INSERTFIELDS(["学号"], ["姓名"], ["英语成绩"]) VALUES("06", "路人甲", 80) END;
|
||
|
||
-- 批量插入
|
||
A1 := array(("学号":"07", "姓名":"路人乙"), ("学号":"08", "姓名":"路人丙"));
|
||
INSERT INTO A A1 END;
|
||
```
|
||
|
||
#### 高级功能
|
||
|
||
##### JOIN 操作
|
||
|
||
1. **JOIN** - 内连接
|
||
2. **LEFT JOIN** - 左连接
|
||
3. **RIGHT JOIN** - 右连接
|
||
4. **FULL JOIN** - 全连接
|
||
5. **CROSS JOIN** - 笛卡尔积
|
||
|
||
##### JOIN 语法
|
||
|
||
```sql
|
||
-- 使用ON条件
|
||
SELECT * FROM A JOIN B ON [1].["学号"] = [2].["学号"] END;
|
||
|
||
-- 使用WITH ON优化(推荐)
|
||
SELECT * FROM A JOIN B WITH ([1].["学号"] ON [2].["学号"]) END;
|
||
|
||
-- 多字段JOIN
|
||
SELECT * FROM A JOIN B WITH ([1].["学号"], [1].["班级"] ON [2].["学号"], [2].["班级"]) END;
|
||
|
||
-- 多表JOIN
|
||
SELECT [1].*, [2].["英语成绩"], [3].["语文成绩"]
|
||
FROM A
|
||
JOIN B ON [1].["学号"] = [2].["学号"]
|
||
JOIN C ON [1].["学号"] = [3].["学号"]
|
||
END;
|
||
```
|
||
|
||
##### 聚集函数
|
||
|
||
| 函数 | 说明 |
|
||
| --------- | ------ |
|
||
| AvgOf() | 平均值 |
|
||
| SumOf() | 求和 |
|
||
| CountOf() | 计数 |
|
||
| MaxOf() | 最大值 |
|
||
| MinOf() | 最小值 |
|
||
|
||
##### 嵌套查询
|
||
|
||
```sql
|
||
SELECT *,
|
||
(SELECT ["成绩"] FROM B WHERE ["学号"] = RefsOf(["学号"], 1) END) AS "成绩"
|
||
FROM A END;
|
||
```
|
||
|
||
#### 特殊关键字
|
||
|
||
##### ThisRow
|
||
|
||
- 访问当前行的完整数据
|
||
- 对一维数组查询特别有用
|
||
- 多表时使用 `ThisRow(表序号)`
|
||
|
||
##### ThisRowIndex
|
||
|
||
- 返回当前行的索引
|
||
- 即使在 ORDER BY 后仍返回原始位置
|
||
- 多表时使用 `ThisRowIndex(表序号)`
|
||
|
||
##### ThisGroup
|
||
|
||
- 在 GROUP BY 中使用
|
||
- 代表当前分组的子结果集
|
||
- 只能在 SELECT 的 FROM 子句中使用
|
||
|
||
##### ThisOrder
|
||
|
||
- 获取排序后的位置
|
||
- 相同值有相同排序号
|
||
- 排序号从 1 开始
|
||
|
||
##### RefsOf
|
||
|
||
- 访问上级结果集
|
||
- 语法:`RefsOf(表达式, 上级层数)`
|
||
- 用于嵌套查询中引用外层数据
|
||
|
||
#### 示例集合
|
||
|
||
##### 基础查询
|
||
|
||
```sql
|
||
-- 简单查询
|
||
SELECT * FROM ScoreList END;
|
||
|
||
-- 条件查询
|
||
SELECT * FROM ScoreList WHERE ["英语成绩"] > 85 END;
|
||
|
||
-- 排序查询
|
||
SELECT * FROM ScoreList ORDER BY ["英语成绩"] DESC END;
|
||
|
||
-- 限制结果
|
||
SELECT DRANGE(0 TO 9) * FROM ScoreList ORDER BY ["英语成绩"] DESC END;
|
||
```
|
||
|
||
##### 计算和转换
|
||
|
||
```sql
|
||
-- 添加计算列
|
||
SELECT *,
|
||
RoundTo((["英语成绩"] + ["语文成绩"] + ["历史成绩"] + ["地理成绩"]) / 4, 2) AS "文科成绩"
|
||
FROM ScoreList END;
|
||
|
||
-- 使用聚集函数
|
||
SELECT AvgOf(["英语成绩"]) FROM ScoreList END;
|
||
|
||
-- 条件聚集
|
||
SELECT AvgOf(["英语成绩"]) FROM ScoreList WHERE ["英语成绩"] > 85 END;
|
||
```
|
||
|
||
##### 分组统计
|
||
|
||
```sql
|
||
-- 简单分组
|
||
SELECT ["性别"], AvgOf(["成绩"]), CountOf(*)
|
||
FROM ScoreList
|
||
GROUP BY ["性别"] END;
|
||
|
||
-- 多字段分组
|
||
SELECT ["性别"], ["年级"], AvgOf(["成绩"])
|
||
FROM ScoreList
|
||
GROUP BY ["性别"], ["年级"] END;
|
||
|
||
-- 分组筛选
|
||
SELECT groupfunc(["英语成绩"]), AvgOf(["英语成绩"]), CountOf(*)
|
||
FROM ScoreList
|
||
GROUP BY groupfunc(["英语成绩"])
|
||
HAVING CountOf(*) > 1 END;
|
||
```
|
||
|
||
##### 一维数组操作
|
||
|
||
```sql
|
||
-- 查询一维数组
|
||
R := array(1, 2, 3, 4, 5, 6);
|
||
R1 := SELECT ThisRow FROM R WHERE ThisRow > 5 END;
|
||
|
||
-- 返回一维结果
|
||
R2 := SSELECT ThisRow FROM R WHERE ThisRow > 5 END;
|
||
|
||
-- 更新一维数组
|
||
UPDATE R SET ThisRow = ThisRow * 10 END;
|
||
```
|
||
|
||
##### 复杂查询
|
||
|
||
```sql
|
||
-- 多表连接与计算
|
||
SELECT
|
||
[1].["学号"],
|
||
[1].["姓名"],
|
||
[2].["英语成绩"],
|
||
[3].["数学成绩"],
|
||
([2].["英语成绩"] + [3].["数学成绩"]) / 2 AS "平均分"
|
||
FROM 学生表
|
||
LEFT JOIN 英语成绩表 ON [1].["学号"] = [2].["学号"]
|
||
LEFT JOIN 数学成绩表 ON [1].["学号"] = [3].["学号"]
|
||
WHERE [1].["班级"] = "一班"
|
||
ORDER BY "平均分" DESC
|
||
END;
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **字段名大小写敏感**
|
||
2. **表序号从 1 开始计数**
|
||
3. **使用 WITH ON 代替 ON 以提高 JOIN 性能**
|
||
4. **聚集函数使用时注意添加 of 后缀**
|
||
5. **空值(NIL)的处理需要特别注意**
|
||
6. **UPDATE 可以自动创建新列(针对内存结果集)**
|
||
|
||
## 性能优化建议
|
||
|
||
1. 使用 WITH ON 进行 JOIN 操作
|
||
2. 合理使用 DRANGE 限制结果集大小
|
||
3. 在大数据集上使用 MSELECT 返回 Matrix 类型
|
||
4. 避免在 WHERE 子句中使用复杂计算
|
||
5. 适当使用索引和预计算优化查询
|
||
|
||
## 📝 语法规则和优先级
|
||
|
||
### 运算符优先级(从高到低)
|
||
|
||
1. **成员访问和数组访问**:`.` `[]`
|
||
2. **后缀运算符**:`++` `--`(后缀)
|
||
3. **前缀运算符**:`++` `--`(前缀)、`+` `-`(正负号)、`.!!` `not`、`.!`、`!`(求逆)、`` ` ``(矩阵转置)
|
||
4. **乘方运算符**:`^` `~` `:^`(矩阵乘方)
|
||
5. **乘除运算符**:`*` `/` `%` `mod` `div` `:*`(矩阵乘法)`:\\`(矩阵左除)
|
||
6. **加减运算符**:`+` `-` `|`(矩阵列连接)`Union`(矩阵行连接)`:|`(非完全矩阵列连接)
|
||
7. **连接运算符**:`$`
|
||
8. **位移运算符**:`shl` `rol` `shr` `ror`
|
||
9. **比较运算符**:`=` `<>` `<` `>` `<=` `>=`
|
||
10. **集合运算符**:`union` `union2` `minus` `intersect`
|
||
11. **判断运算符**:`is class()` `in`
|
||
12. **位与运算符**:`.&`
|
||
13. **位异或运算符**:`.^`
|
||
14. **位或运算符**:`.|`
|
||
15. **逻辑与运算符**:`.&&` `and`
|
||
16. **逻辑或运算符**:`.||` `or`
|
||
17. **三元条件运算符**:`? :`
|
||
18. **赋值运算符**:`:=` `+=` `-=` `*=` `/=` `union=` `union2=` `minus=` `intersect=`
|
||
|
||
### 语法规则说明
|
||
|
||
**自增自减语句规则:**
|
||
|
||
- **前缀自增自减**:`++variable;` `--variable;` - 作为独立的 `increment_statement`
|
||
- **后缀自增自减**:`variable++;` `variable--;` - 作为 `postfix_expression`,然后作为 `expression_statement` 使用
|
||
- **优先级和语义**:
|
||
- 前缀:先修改变量值,再返回新值
|
||
- 后缀:先返回原值,再修改变量值
|
||
- 在表达式中使用时,两者的语义不同
|
||
|
||
**语句块规则:**
|
||
|
||
- 单行语句:可以省略 `begin end`
|
||
- 多行语句:必须用 `begin end` 包围
|
||
- `end` 后的分号可有可无
|
||
|
||
**类语法规则:**
|
||
|
||
- **类声明**:`type ClassName = class [inheritance] [members] end [;]`
|
||
- **继承语法**:`class(BaseClass)`
|
||
- **访问修饰符**:影响后续所有成员,直到遇到新的修饰符
|
||
- **成员标签**:`[tag]` 必须紧接在成员名称前
|
||
- **方法实现**:可以在类内或类外实现
|
||
- **操作符重载**:使用 `function operator[symbol]` 语法,类外实现使用 `function operator ClassName.[symbol]`
|
||
|
||
**Unit 语法规则:**
|
||
|
||
1. **Unit 声明必须在文件开头**
|
||
2. **Unit 名称后的分号不能省略**
|
||
3. **结束标记必须是 `end.`(点号不能省略)**
|
||
4. **一个文件只能包含一个 Unit**
|
||
5. **使用 `uses` 引入单元时,单元名不需要引号**
|
||
|
||
## 🚀 实际应用示例
|
||
|
||
### 使用所有新特性的综合示例
|
||
|
||
```tsf
|
||
// 使用所有新特性的综合示例
|
||
function comprehensive_matrix_processor(input_data);
|
||
begin
|
||
// 使用解包获取输入
|
||
[matrices, sets, config, filters] := input_data;
|
||
|
||
// 验证配置
|
||
if not (config["mode"] in array("matrix", "set", "mixed")) then
|
||
raise "Invalid mode: " $ config["mode"] $ " (expected: matrix/set/mixed)";
|
||
|
||
processed_results := array();
|
||
|
||
for i := 0 to length(matrices) - 1 do
|
||
begin
|
||
matrix := matrices[i];
|
||
|
||
// 使用is class判断对象类型
|
||
if matrix is class(Matrix) then
|
||
begin
|
||
echo "Processing matrix: " $ matrix.name $ " (size: " $ matrix.rows $ "x" $ matrix.cols $ ")";
|
||
|
||
// 矩阵运算
|
||
transposed := `matrix.data; // 矩阵转置(前缀)
|
||
inverted := !matrix.data; // 矩阵求逆
|
||
squared := matrix.data :^ 2; // 矩阵平方
|
||
|
||
// 矩阵连接运算
|
||
if i < length(matrices) - 1 then
|
||
begin
|
||
next_matrix := matrices[i + 1];
|
||
if next_matrix is class(Matrix) then
|
||
begin
|
||
// 尝试不同的连接方式
|
||
col_concat := matrix.data | next_matrix.data; // 列连接
|
||
row_concat := matrix.data Union next_matrix.data; // 行连接
|
||
|
||
// 矩阵乘法
|
||
if matrix.cols = next_matrix.rows then
|
||
multiplied := matrix.data :* next_matrix.data;
|
||
end;
|
||
end;
|
||
|
||
processed_results[length(processed_results)] := array(
|
||
"type": "matrix",
|
||
"original": matrix.data,
|
||
"transposed": transposed,
|
||
"operations": array("transpose", "invert", "power")
|
||
);
|
||
end
|
||
else begin
|
||
echo "Skipping non-matrix object at index " $ i;
|
||
end;
|
||
end;
|
||
|
||
// 集合运算处理
|
||
combined_sets := array();
|
||
for j := 0 to length(sets) - 1 do
|
||
begin
|
||
current_set := sets[j];
|
||
|
||
// 集合运算
|
||
if j = 0 then
|
||
combined_sets := current_set
|
||
else begin
|
||
// 根据配置选择不同的集合运算
|
||
operation := config["set_operation"];
|
||
if operation = "union" then
|
||
combined_sets union= current_set
|
||
else if operation = "intersect" then
|
||
combined_sets intersect= current_set
|
||
else if operation = "minus" then
|
||
combined_sets minus= current_set
|
||
else
|
||
combined_sets union2= current_set;
|
||
end;
|
||
end;
|
||
|
||
// 使用函数指针进行回调处理
|
||
if "callback" in config then
|
||
begin
|
||
callback_ptr := config["callback"];
|
||
for result in processed_results do
|
||
begin
|
||
##callback_ptr(result); // 函数指针调用
|
||
end;
|
||
end;
|
||
|
||
// 矩阵转置表达式语句
|
||
`matrix; // 矩阵转置表达式语句(前缀)
|
||
matrix1 :* matrix2; // 矩阵乘法表达式语句
|
||
|
||
// 自增自减表达式语句
|
||
counter++; // 后缀自增表达式语句
|
||
working_set.length++; // 对象成员自增表达式语句
|
||
|
||
return array(
|
||
"matrices": processed_results,
|
||
"combined_sets": combined_sets,
|
||
"total_operations": length(processed_results) + length(sets)
|
||
);
|
||
end;
|
||
```
|
||
|
||
## 🔧 语法解析器使用
|
||
|
||
### 生成解析器
|
||
|
||
```bash
|
||
tree-sitter generate
|
||
```
|
||
|
||
### 运行测试
|
||
|
||
```bash
|
||
chmod +x test_tsf.sh
|
||
./test_tsf.sh
|
||
```
|
||
|
||
### 解析单个文件
|
||
|
||
```bash
|
||
tree-sitter parse your_file.tsf
|
||
```
|
||
|
||
### 调试语法
|
||
|
||
```bash
|
||
tree-sitter parse your_file.tsf --debug
|
||
```
|
||
|
||
## 📊 支持的特性总结
|
||
|
||
✅ **完整支持的特性:**
|
||
|
||
- 🔧 **函数定义和调用**(参数类型、默认值、重载)
|
||
- 🔗 **函数指针调用**(`##pointer(args)` 语法)
|
||
- 📊 **灵活的嵌套数组系统**(支持表达式、函数调用、元组、键值对混合)
|
||
- 📤 **解包(destructuring)赋值语法**(数组元素自动分配)
|
||
- 🔑 **关键字语句**(echo 输出、raise 异常抛出)
|
||
- 🔗 **$万能连接符**(任意类型自动转换连接)
|
||
- 🔍 **判断语法**(is class 类型检查、in 成员检查)
|
||
- 📊 **矩阵运算系统**(前缀转置、求逆、乘法、连接、乘方等)
|
||
- 🔢 **集合运算系统**(并集、交集、差集及其复合赋值)
|
||
- 📝 **表达式语句**(任何表达式都可以作为独立语句使用)
|
||
- 🏗️ **完整的类和对象系统**(继承、访问控制、方法重写、操作符重载)
|
||
- 📦 **Unit 模块系统**(接口、实现、初始化、析构)
|
||
- ➕ **丰富的运算符集合**(算术、逻辑、位运算、三元表达式)
|
||
- 🔀 **完整的控制流语句**(if/else、case、循环、跳转)
|
||
- 🔍 **特殊查询语法**(vselect/select/sselect)
|
||
- 🔢 **多种数字格式**(十进制、科学记数法、十六进制、二进制、八进制)
|
||
- 🗨️ **多种注释类型**(行注释、两种块注释)
|
||
- 📝 **数组索引和切片访问**(多维数组、嵌套访问、切片操作)
|
||
- 🆕 **对象创建和成员访问**(new 操作符、链式调用、成员操作)
|
||
|
||
**🆕 新增的高级特性:**
|
||
|
||
- **操作符重载**:`function operator[symbol]` 语法,支持类的自定义运算符行为
|
||
- **函数指针调用**:`##pointer(args)` 语法,支持动态函数调用
|
||
- **矩阵运算**:`` ` ``转置(前缀)、`!`求逆、`:*`乘法、`:\\`左除、`:^`乘方、`|`列连接、`Union`行连接
|
||
- **集合运算**:`union`并集、`intersect`交集、`minus`差集、`union2`特殊并集
|
||
- **复合赋值扩展**:`union=`、`intersect=`、`minus=`、`union2=`等集合运算复合赋值
|
||
- **表达式语句**:支持将任何表达式作为独立语句,便于函数调用和副作用操作
|
||
|
||
这个语法解析器为 TSF 语言提供了完整的语法支持,特别是在数组处理、类型检查、异常处理、字符串连接、矩阵运算、集合运算、操作符重载和函数指针调用方面具有强大的能力。这些特性使得 TSF 语言在科学计算、数据处理和面向对象编程领域更加强大和实用。
|