输入格式
本章描述了源文件如何被解释为词法单元序列。
有关程序如何组织成文件的描述,请参阅crate和源文件。
源文件编码
每个源文件都被解释为以UTF-8编码的Unicode字符序列。
如果文件不是有效的UTF-8,则会报错。
字节序标记移除
如果序列中的第一个字符是U+FEFF(字节序标记),则将其移除。
CRLF规范化
每对紧跟着U+000A (LF) 的U+000D (CR) 字符会被单个U+000A (LF) 替换。此操作只执行一次,不会重复,因此在规范化之后,输入中仍然可能存在紧跟着U+000A (LF) 的U+000D (CR)(例如,如果原始输入包含 “CR CR LF LF”)。
字符U+000D (CR) 的其他出现位置则保留不变(它们被视为空白符)。
Shebang移除
如果剩余序列以字符#!开头,则从序列中移除直到(并包括)第一个U+000A (LF) 的所有字符。
例如,以下文件的第一行将被忽略:
#!/usr/bin/env rustx
fn main() {
println!("Hello!");
}
作为例外,如果#!字符后面紧跟着(忽略中间的注释或空白符)一个[词法单元,则不进行任何移除。这可以防止源文件开头的内部属性被移除。
注意
标准库的
include!宏会对其读取的文件进行字节序标记移除、CRLF规范化和Shebang移除。include_str!和include_bytes!宏则不会。
词法单元化
然后,所得的字符序列将转换为词法单元,具体描述见本章的其余部分。