词法结构

Flurry 代码由一系列遵循特定规则的词法单元 (Tokens) 构成。词法分析器 (Lexer) 负责将源代码文本流分解为这些有意义的单元。理解这些基本规则有助于编写语法正确的 Flurry 代码。

标识符 (Identifiers)

标识符用于命名变量、函数、类型、模块等。Flurry 的标识符必须遵循以下规则:

  • 字母 (a-z, A-Z) 或下划线 (_) 开头。
  • 开头字符后可以跟任意数量的字母数字 (0-9) 或下划线
  • 标识符是大小写敏感的(myVariablemyvariable 是不同的标识符)。
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、编译时求值和沉降机制的暗示,以及整体的语气把握。