跳到主要内容

基础语法与文件

本章由浅入深介绍 Sii 的基本语法与文件组织,帮助你在几分钟内写出第一段可运行的 Sii 程序。

文件与扩展名

  • 源文件使用后缀:.sii
  • 约定入口文件:main.sii(可自定义)

建议采用 UTF-8 编码与统一的缩进风格(空格 2 或 4 均可,项目内保持一致)。


标识符与命名

  • 允许字母、数字、下划线,不能以数字开头
  • 推荐使用小驼峰(变量、函数)与大驼峰(类、模块)

保留关键字(按词法定义): letconstfuncbackpushoutrmvnewtypeinsstrstringintboolsinglefmultifarrclassobjunknownvoidshareciteifelseesleforloopwhilecontinuebreakremakecrobcitesharefromtruefalse

变量与字面量

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

数值字面量

  • 支持十进制整数与小数:0423.14
  • 暂不建议使用前导零等特殊写法(例如 007),以免产生歧义

字符串字面量与转义

  • 支持双引号与单引号:"text"'text'
  • 支持常见转义序列:\n 换行、\t 制表、\r 回车、\\ 反斜杠、\" 双引号、\' 单引号
let line: string = "first\nsecond";
let path: string = "C:\\Users\\sii";

布尔字面量

布尔值仅有 truefalse

let enabled: boolean = true;
enabled = false;

数组

Sii 使用显式数组类型与构造,后面会详细讲述:

let nums: arr = new Array();
let nums[0]: int = 1;
let nums[1]: int = 2;

数值字面量支持十进制(如 042),布尔字面量为 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");
}

更多语法见“控制流”章节。

如果需要循环,可使用 whileforloop(视项目支持情况):

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 支持通过 sharecite 关键字实现代码的模块化组织:

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

出现错误时优先检查:

  • 类型是否标注正确
  • 是否拼写错误
  • 表达式是否缺少分号或括号

最佳实践

  • 一行只做一件事,语句结尾加分号
  • 函数尽量短且语义明确,返回类型显式标注
  • 变量命名体现意图而非实现细节
  • 在类与模块出现之前,先用变量、函数把“数据 + 行为”讲清楚