标识符
Lexer
IDENTIFIER_OR_KEYWORD → ( XID_Start | _ ) XID_Continue*
XID_Start → <XID_Start defined by Unicode>
XID_Continue → <XID_Continue defined by Unicode>
RAW_IDENTIFIER → r# IDENTIFIER_OR_KEYWORD
NON_KEYWORD_IDENTIFIER → IDENTIFIER_OR_KEYWORDexcept a strict or reserved keyword
IDENTIFIER → NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER
RESERVED_RAW_IDENTIFIER →
r# ( _ | crate | self | Self | super ) !XID_Continue
标识符遵循 Unicode 标准附录 #31 中 Unicode 版本 17.0 的规范,并包含下文所述的补充。以下是一些标识符的示例:
foo_identifierr#trueМосква東京
UAX #31 使用的配置为:
- Start :=
XID_Start,加上下划线字符(U+005F) - Continue :=
XID_Continue - Medial := 空
Note
以下划线开头的标识符通常用于表示有意未使用的标识符,并且会消除
rustc中“未使用“的警告。
标识符不能是严格或保留关键字,除非使用下文原始标识符中描述的 r# 前缀。
零宽度非连接符(ZWNJ U+200C)和零宽度连接符(ZWJ U+200D)字符不允许出现在标识符中。
在以下情况下,标识符仅限于 XID_Start 和 XID_Continue 的 ASCII 子集:
extern crate声明(除 AsClause 标识符外)- 在路径中引用的外部 crate 名称
- 从文件系统加载且不带
path属性的模块名称 - 带有
no_mangle属性的程序项 - 外部块中的程序项名称
规范化
标识符使用 Unicode 标准附录 #15 中定义的规范化形式 C(NFC)进行规范化。如果两个标识符的 NFC 形式相等,则它们相等。
原始标识符
原始标识符类似于普通标识符,但带有 r# 前缀。(注意,r# 前缀不算作实际标识符的一部分。)
与普通标识符不同,原始标识符可以使用任何严格或保留关键字,但 RAW_IDENTIFIER 中以上列出的除外。
使用 RESERVED_RAW_IDENTIFIER token 是错误的。