基础语法与文件
本章由浅入深介绍 Sii 的基本语法与文件组织,帮助你在几分钟内写出第一段可运行的 Sii 程序。
文件与扩展名
- 源文件使用后缀:
.sii - 约定入口文件:
main.sii(可自定义)
建议采用 UTF-8 编码与统一的缩进风格(空格 2 或 4 均可,项目内保持一致)。
标识符与命名
- 允许字母、数字、下划线,不能以数字开头
- 推荐使用小驼峰(变量、函数)与大驼峰(类、模块)
保留关键字(按词法定义):
let、const、func、back、push、out、rmv、new、typeins、str、string、int、bool、singlef、multif、arr、class、obj、unknown、void、share、cite、if、else、esle、forloop、while、continue、break、remake、crob、cite、share、from、true、false。
变量与字面量
let name: string = "Sii";
let version: int = 1;
let ok: boolean = true;
说明:使用 let 标识符: 类型 = 初始值; 形式,字符串用双引号。
声明方式与可变性
let:可变绑定,允许后续重新赋值(需保持类型一致)const:不可变常量,声明后不可再重新赋值
let counter: int = 0;
counter = counter + 1; // 合法
const appName: string = "Sii";
// appName = "Sii2"; // 不合法:const 不可重新赋值
类型标注与一致性
变量的类型需要显式标注;后续赋值必须与声明类型一致:
let title: string = "hello";
// title = 123; // 不合法:期望 string
数值字面量
- 支持十进制整数与小数:
0、42、3.14 - 暂不建议使用前导零等特殊写法(例如
007),以免产生歧义
字符串字面量与转义
- 支持双引号与单引号:
"text"、'text' - 支持常见转义序列:
\n换行、\t制表、\r回车、\\反斜杠、\"双引号、\'单引号
let line: string = "first\nsecond";
let path: string = "C:\\Users\\sii";
布尔字面量
布尔值仅有 true 与 false:
let enabled: boolean = true;
enabled = false;
数组
Sii 使用显式数组类型与构造,后面会详细讲述:
let nums: arr = new Array();
let nums[0]: int = 1;
let nums[1]: int = 2;
数值字面量支持十进制(如 0、42),布尔字面量为 true/false。
注释
支持行注释与块注释:
// 行注释
/* 块注释 */
分号用于结束语句,建议保留分号。
需要注意的是,Sii不支持将注释与代码写在同一行,因此开发者需要将注释和代码分为上下行进行撰写
表达式与运算
let msg: string = "Hello, " + name;
let total: int = 1 + 2 * 3;
说明:
- 字符串拼接使用
+ - 算术运算遵循常见优先级(先乘除后加减)
- Sii 1.0.2 ~ 1.2.1版本不支持使用负数进行赋值,需要使用
0 - value的格式来手动运算负数 - 比较与逻辑运算(示例):
let bigger: boolean = total > 3;
let both: boolean = ok && (total == 7);
自增/自减与赋值顺序
Sii通过方法控制“运算与赋值”的先后,它们的语法是:toUp(num)、getUp(num)、toDn(num)、getDn(num),详细的样例如下:
let i: int = 1;
i.toUp(1); // 先赋值,再加 1(等价于 i = i; i = i + 1 的语义顺序)
i.getUp(1); // 先加 1,再赋值
i.toDn(1); // 先赋值,再减 1
i.getDn(1); // 先减 1,再赋值
这些方法常用于 forloop 的迭代段或循环体内的计数更新,num代表自增/自减的跨度(这个值必须是int类型)。
函数
func greet(who: string): string {
back "Hello, " + who;
}
let out: string = greet(name);
func 名称(参数: 类型): 返回类型 { back 表达式; } 用于定义函数;back 用于返回值,当然在Sii中函数可以无返回值。
需要注意的是Sii 1.0.2 ~ 1.2.1版本不能用
back返回负数,这将会导致程序编译报错,需要使用0 - value的格式来手动运算负数。
无返回值时可使用 void:
func logLine(text: string): void {
print(text);
}
函数参数需显式标注类型,返回类型建议显式标注以提升可读性与约束性。
函数调用方式
方法1:直接调用并接收返回值。
let r1: string = greet("Sii");
方法2:使用 back 函数名(参数列表) => 变量名; 语法,把函数返回值赋给变量(等价于“调用并返回给”)。
back greet("Sii") => r2; // r2需要先定义好
说明 第二种写法常用于强调“把结果返回给某变量”的意图,语义等价于方法1的赋值形式。
控制流(预览)
if (ok) {
print("OK");
} else {
print("NO");
}
更多语法见“控制流”章节。
如果需要循环,可使用 while 或 forloop(视项目支持情况):
let i: int = 0;
while (i < 3) {
print(i.toString());
i = i + 1;
}
数组(入门)
Sii 中数组采用显式类型与构造形式:
let nums: arr = new Array();
使用下标进行读写:
nums[0] = 1;
nums[1] = 2;
let first: int = nums[0];
更多语法见“数组与语句”章节。
说明:
- 数组类型标注为
arr
类与属性(入门)
class Demo {
title: string;
count: int;
}
class 用于建模领域模版;属性采用 成员变量: 类型; 形式,其中每行可以无标点符号结尾即成员变量: 类型也是合法的写法。另外不同的是Sii的类中不能构建方法,仅允许构建属性模版。
实例化与访问:
需要注意的是,Sii中的类仅能够被对象调用,不能直接进行使用
// 定义对象
crob Demo(class: 类名, ...) { // 类名传递给对象的class参数,这样对象就可以直接调用类中定义的属性
// 对象实体的定义
}
模块与引用(入门)
Sii 支持通过 share 和 cite 关键字实现代码的模块化组织:
share 关键字
用于向全局分享函数和类:
share func add(a: int, b: int): int {
back a + b;
}
share class Calculator {
result: int;
}
cite 关键字
用于引用其他文件中的分享内容:
cite { add, Calculator } from "./math.sii";
let result: int = add(5, 3);
crob calc = new Calculator();
更多语法见"模块与引用"章节。
错误信息与排错
编译器会指出所在文件与大致位置,并给出清晰的原因。常见错误示例:
类型不匹配:期望 string,但得到 int
未定义的标识符:greetx
出现错误时优先检查:
- 类型是否标注正确
- 是否拼写错误
- 表达式是否缺少分号或括号
最佳实践
- 一行只做一件事,语句结尾加分号
- 函数尽量短且语义明确,返回类型显式标注
- 变量命名体现意图而非实现细节
- 在类与模块出现之前,先用变量、函数把“数据 + 行为”讲清楚