词法结构
Flurry 代码由一系列遵循特定规则的词法单元 (Tokens) 构成。词法分析器 (Lexer) 负责将源代码文本流分解为这些有意义的单元。理解这些基本规则有助于编写语法正确的 Flurry 代码。
标识符 (Identifiers)
标识符用于命名变量、函数、类型、模块等。Flurry 的标识符必须遵循以下规则:
- 以字母 (a-z, A-Z) 或下划线 (
_
) 开头。 - 开头字符后可以跟任意数量的字母、数字 (0-9) 或下划线。
- 标识符是大小写敏感的(
myVariable
和myvariable
是不同的标识符)。
let user_name = "Alice"; -- 合法的标识符
const MAX_CONNECTIONS = 100;
fn _internal_helper() { ... }
-- let 1st_attempt = 0; -- 非法,不能以数字开头
-- let user-name = "Bob"; -- 非法,包含非法字符 '-'
关键字 (Keywords)
关键字是 Flurry 语言保留的、具有特殊含义的标识符,不能用作普通标识符。Flurry 拥有一套精心设计的关键字集合,以支持其丰富的特性。
TODO: 在此列出 Flurry 的完整关键字列表,或链接到附录中的关键字参考。
例如,fn
, let
, const
, struct
, enum
, if
, else
, while
, for
, use
, mod
, comptime
, impl
, trait
, unsafe
等都是 Flurry 的关键字。
运算符 (Operators)
Flurry 支持多种运算符,用于执行算术、逻辑、比较、赋值等操作。一些常见的运算符包括 +
, -
, *
, /
, %
, ==
, !=
, <
, >
, <=
, >=
, =
, .
等。
空格敏感性: Flurry 对某些二元运算符(+
, -
, /
, *
, %
, <
, >
)引入了空格敏感性规则,以减少歧义(特别是泛型尖括号 <
>
与比较运算符的混淆):
- 当这些运算符两侧都有空格时,它们被识别为标准的二元算术或比较运算符。
let sum = a + b; let is_greater = x > y;
- 如果至少一侧没有空格,它们会被词法分析器识别为不同的 token(例如,用于泛型或模板的尖括号)。
let list: Vec<i32>; -- '<' 和 '>' 两侧无空格,被识别为泛型分隔符 -- a+b -- 词法分析器可能不会将其识别为标准加法
这项规则鼓励开发者在二元运算中使用空格,提高代码可读性,并在词法层面解决常见的解析冲突。
注释 (Comments)
注释用于在代码中添加说明,它们会被编译器忽略。Flurry 支持两种类型的注释:
- 行注释 (Line Comment): 以
--
开始,直到行尾。-- 这是一个行注释 let timeout = 1000; -- 设置超时时间 (毫秒)
- 块注释 (Block Comment): 以
{-
开始,以-}
结束,可以跨越多行,并且通常支持嵌套。{- 这是一个块注释。 它可以包含多行文本。 {- 嵌套的块注释 -} -} let config = load_config();
分号 (Semicolons) 与语句结束
Flurry 使用分号 ;
来分隔或结束语句。然而,为了简洁性,Flurry 引入了一条特殊的分号省略规则:
- 当一个语句的最后一个 token 的最后一个字符是右花括号
}
时,该语句末尾的分号可以省略。
这常见于代码块(函数体、结构体定义、if
块等)或某些复合字面量(如 object
字面量)的结束处。
struct Point { x: i32, y: i32 } -- '}' 结尾,可省略 ';'
fn main() {
println("Hello"); -- ')' 结尾,不可省略 ';'
if true {
do_something() -- 函数体 '}' 结尾,可省略 ';'
} -- if 语句 '}' 结尾,可省略 ';'
} -- main 函数体 '}' 结尾,可省略 ';'
let data = { .key "value" } -- object 字面量 '}' 结尾,可省略 ';'
在不符合此规则的情况下,语句末尾必须使用分号。这条规则旨在提高常见代码模式的视觉整洁度,但并不改变语句的基本分隔原则。
理解这些基本的词法规则是编写和阅读 Flurry 代码的基础。
请检查这些内容是否符合您的预期,特别是关于可选参数默认 null
、do block、编译时求值和沉降机制的暗示,以及整体的语气把握。