第一章. 表义符/符号
表义符
示例 释义 CAPITAL KW_IF, INTEGER_LITERAL 由词法分析生成的单一 token ItalicCamelCase LetStatement, Item 句法产生式(syntactical production) string
x
,while
,*
确切的字面字符(串) \x \n, \r, \t, \0 转义字符 x? pub
?可选项 x* OuterAttribute* x 重复零次或多次 x+ MacroMatch+ x 重复一次或多次 xa..b HEX_DIGIT1..6 x 重复 a 到 b 次 | u8
|u16
, Block | Item或 [ ] [ b
B
]列举的任意字符 [ - ] [ a
-z
]a 到 z 范围内的任意字符(包括 a 和 z) ~[ ] ~[ b
B
]列举范围外的任意字符(序列) ~ string
~ \n
, ~*/
此字符序列外的任意字符(序列) ( ) ( ,
Parameter)?程序项分组
第二章. 词法结构
2.1 输入格式
Rust 输入被解释为用UTF-8编码的Unicode 字符序列;
2.2 关键字
Rust 将关键字分为三类:
2.2.1. 严格关键字
这类关键字只能在正确的上下文中使用。它们不能用作以下名称:
词法分析:
KW_AS :as //重命名
KW_BREAK :break//终止
KW_CONST :const//设置常量
KW_CONTINUE :continue//继续
KW_CRATE :crate//self 包名
KW_ELSE :else//判断
KW_ENUM :enum//枚举
KW_EXTERN :extern//继承其他语法
KW_FALSE :false//bool
KW_FN :fn//函数
KW_FOR :for//循环
KW_IF :if//判断
KW_IMPL :impl//trait 引入机构
KW_IN :in//
KW_LET :let//定义
KW_LOOP :loop//循环
KW_MATCH :match//匹配
KW_MOD :mod//定义块
KW_MOVE :move//所有权转移
KW_MUT :mut//定义可以修改变量
KW_PUB :pub//快或者函数可以访问
KW_REF :ref //数据类型
KW_RETURN :return//返回
KW_SELFVALUE :self//自己
KW_SELFTYPE :Self//自己类型
KW_STATIC :static//静态
KW_STRUCT :struct//结构
KW_SUPER :super//引入
KW_TRAIT :trait//方法实现
KW_TRUE :true//bool
KW_TYPE :type//引入类型
KW_UNSAFE :unsafe//不安全
KW_USE :use//引入包
KW_WHERE :where//条件
KW_WHILE :while//条件
词法分析 2018+
KW_ASYNC :async//异步
KW_AWAIT :await//异步
KW_DYN :dyn//
是trait对象类型 动态分发;
2.2.2 保留关键字
词法分析
KW_ABSTRACT :abstract
KW_BECOME :become
KW_BOX :box
KW_DO :do
KW_FINAL :final
KW_MACRO :macro
KW_OVERRIDE :override
KW_PRIV :priv
KW_TYPEOF :typeof
KW_UNSIZED :unsized
KW_VIRTUAL :virtual
KW_YIELD :yield
词法分析 2018+
KW_TRY :try
2.2.3 弱关键字
这类关键字只有在特定的上下文中才有特殊的意义;
macro_rules
用于创建自定义宏。
union
用于声明联合体(union),它只有在联合体声明中使用时才是关键字。
2.3 标识符
词法分析:
IDENTIFIER_OR_KEYWORD :
XID_start XID_continue*
|_
XID_continue+RAW_IDENTIFIER :
r#
IDENTIFIER_OR_KEYWORD 排除crate
,self
,super
,Self
NON_KEYWORD_IDENTIFIER : IDENTIFIER_OR_KEYWORD *排除严格关键字和保留关键字 *
IDENTIFIER :
NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER
https://github.com/rust-lang/reference/blob/master/src/identifiers.md
1. 标识符或关键字:首字母 XID_start(字母), XID_continue*其他(字母或者下划线);或者搜字母下划线 其他XID_continue+
2. RAW_IDENTIFIER:
3. NON_KEYWORD_IDENTIFIER:
4.IDENTIFIER:
2.4 注释
Lexer
LINE_COMMENT : //行注释
//
(~[/
!
\n
] |//
) ~\n
*。
|//
BLOCK_COMMENT :
/*
(~[*
!
] |**
| BlockCommentOrDoc) (BlockCommentOrDoc | ~*/
)**/
|/**/
|/***/
INNER_LINE_DOC :
//!
~[\n
IsolatedCR]*INNER_BLOCK_DOC :
/*!
( BlockCommentOrDoc | ~[*/
IsolatedCR] )**/
OUTER_LINE_DOC :
///
(~/
~[\n
IsolatedCR]*)?OUTER_BLOCK_DOC :
/**
(~*
| BlockCommentOrDoc ) (BlockCommentOrDoc | ~[*/
IsolatedCR])**/
BlockCommentOrDoc :
BLOCK_COMMENT
| OUTER_BLOCK_DOC
| INNER_BLOCK_DOCIsolatedCR :
A\r
not followed by a\n
2.4.1 行注释(LINE_COMMENT)
//
(~[/
!
\n
] | //
) ~\n
* // 开头 结果多个\n或者0个 ,
2.4.2 快注释(BLOCK_COMMENT)
/*
(~[*
!
] | **
| BlockCommentOrDoc) (BlockCommentOrDoc | ~*/
)* */
| /**/
| /***/ // /* 开头 + 内容 + */结尾 !起重要程度 /*!!*/
2.4.3
内部行文档型注释(INNER_LINE_DOC)
//!
~[\n
IsolatedCR]* // ! 开通的 任意个 IsolatedCR;
2.4.4 内部块文档型注释 INNER_BLOCK_DOC
/*!
( BlockCommentOrDoc | ~[*/
IsolatedCR] )* */
2.4.5
外部行文档型注释
OUTER_LINE_DOC
///
(~/
~[\n
IsolatedCR]*)?
2.4.6 外部块文档型注释 OUTER_BLOCK_DOC
/**
(~*
| BlockCommentOrDoc ) (BlockCommentOrDoc | ~[*/
IsolatedCR])* */
2.5 空白符
空白符是非空字符串,它里面只包含具有 Pattern_White_Space 属性的 Unicode 字符,即:
U+0009
(水平制表符,'\t'
)U+000A
(换行符,'\n'
)U+000B
(垂直制表符)U+000C
(分页符)U+000D
(回车符,'\r'
)U+0020
(空格符,' '
)U+0085
(下一行标记符)U+200E
(从左到右标记符)U+200F
(从右到标左记符)U+2028
(行分隔符)U+2029
(段分隔符)
Rust是一种“格式自由(free-form)”的语言,这意味着所有形式的空白符在文法中仅用于分隔 tokens 的作用,没有语义意义。
2.6 token
token 是采用非递归方式的正则文法(regular languages)定义的基本语法产生式(primitive productions)。Rust 源码输入可以被分解成以下几类 token:
全是细节详情见书中关于token 的说明;