# 6. 词法结构 词法规则将源码划分为标识符、关键字、字面量、运算符和标点。源码使用 UTF-8;空白与注释用于分隔词法单元。 本章代码块展示局部词法形式,使用位置由后续表达式和声明规则决定,不是独立程序。 ## 6.1 标识符 标识符以 `_` 或 Unicode 字母开头,后续可以包含 `_`、Unicode 字母或数字。名称区分大小写。 ```text Product discountedPrice price product_1 ``` namespace 路径段使用标识符。用户名属于系统身份规则,不直接使用源码标识符的定义。 ## 6.2 关键字 本文语法使用以下关键字: | 关键字 | 用途 | | --- | --- | | `use` | 引用 namespace | | `class` | 声明数据结构 | | `function` | 声明函数 | | `let` | 绑定局部结果 | | `return` | 返回函数结果 | | `export`、`scene` | 声明导出的 UI 场景 | | `render` | 定义场景的渲染树 | 这些关键字在相应产生式的位置出现。完整保留字集合见[规范状态](../appendices/specification-status.md#词法与表达式)。 ## 6.3 数字 数字字面量采用十进制,至少包含一位数字。小数点两侧均须有数字: ```endorphin 0 100 1.5 ``` 负号是运算符,而不是数字词法单元。`-4` 是对 `4` 使用一元负号,详见[表达式与绑定](08-expressions-and-bindings.md)。 本文数字语法不包含科学计数法、前导正号或省略小数点一侧数字的形式。数字类型、精度和范围由类型规则定义,而不是由字面量的字符形式决定。 ## 6.4 字符串 字符串由双引号包围,可以直接包含 Unicode 字符: ```endorphin "Product" "商品" "First\nSecond" ``` | 转义 | 含义 | | --- | --- | | `\n` | 换行 | | `\t` | 水平制表符 | | `\"` | 双引号 | | `\\` | 反斜杠 | 双引号、反斜杠和换行在字符串内使用上述转义。未闭合字符串和本文未定义的转义在 Preflight 中产生诊断。 ## 6.5 符号字面量 点号后接标识符表示符号字面量: ```endorphin .title ``` 符号表达命名值,例如 UI 的标题角色。不带点号的 `title` 是名称引用,`product.name` 是成员访问,二者均不等同于 `.title`。 符号可用于哪些参数,由对应声明的类型与取值约定决定。 ## 6.6 标点与运算符 | 字符 | 用途 | | --- | --- | | `{`、`}` | 声明体、函数体和子节点块 | | `(`、`)` | 参数、调用和表达式分组 | | `:` | key 分隔、类型标注和命名参数 | | `,` | 分隔参数 | | `.` | namespace 层级、成员访问和符号前缀 | | `=` | let 绑定 | | `+`、`-`、`*`、`/` | 算术运算 | 冒号的含义由语法位置确定:`alice:shop.data` 中分隔用户与路径,`price: Int` 中标注类型,`gap: 12` 中指定参数名。 ## 6.7 空白与注释 空格、制表符和换行可出现在词法单元之间。缩进不构成代码块,代码块由花括号界定。 行注释以 `//` 开始,持续到下一行或源码结束。函数体片段: ```endorphin // 计算优惠后的金额 let amount = 100 - 10 return amount ``` 注释不参与求值。本文语法不包含块注释。 词法产生式集中列于[形式文法](../appendices/formal-grammar.md#词法)。 [上一章:Preflight 与 inflight](05-preflight-and-inflight.md) · [下一章:类型与类](07-types-and-classes.md) · [目录](../README.md)