import Foundation
/*@H_301_19@如何阅读语法***********************************************/
//? 箭头(→)用来标记语法产式,可以理解为“可以包含”。
//? 斜体文字用来表示句法分类,并出现在一个语法产式规则两侧。
//? 义词和标点符号由粗体固定宽度的文本标记,而且只出现在一个语法产式规则的右侧。
//? 选择性的语法产式由竖线(|)分隔。当可选用的语法产式太多时,为了阅读方便,它们将被拆分为多行语法 产式规则。
//? 少数情况下,常规字体文字用来描述语法产式规则的右边。
/*@H_301_19@词法结构*/
/*@H_301_19@空白与注释***********************************************/
//空白(whitespace)有两个用途:分隔源文件中的标记和帮助区分运算符属于前缀还是后缀,在其他情况下则会被忽略
//注释(comments)被编译器当作空白处理。
/*@H_301_19@标识符***********************************************/
/*@H_301_19@关键字和符号***********************************************/
//下面这些被保留的关键字(keywords)不允许用作标识符,除非被反引号转义
//? @H_301_19@用在声明中的关键字: class@H_301_19@、deinit@H_301_19@、enum@H_301_19@、extension@H_301_19@、func@H_301_19@、import@H_301_19@、init@H_301_19@、let@H_301_19@、protocol@H_301_19@、static@H_301_19@、struct@H_301_19@、subscript@H_301_19@、typealias@H_301_19@、var
//? @H_301_19@用在语句中的关键字: break@H_301_19@、case@H_301_19@、continue@H_301_19@、default@H_301_19@、do@H_301_19@、else@H_301_19@、fallthrough@H_301_19@、if@H_301_19@、in@H_301_19@、for@H_301_19@、return@H_301_19@、switch@H_301_19@、where@H_301_19@、while
//? @H_301_19@用在表达式和类型中的关键字: as@H_301_19@、dynamicType@H_301_19@、is@H_301_19@、new@H_301_19@、super@H_301_19@、self@H_301_19@、Self@H_301_19@、Type@H_301_19@、__COLUMN__@H_301_19@、__FILE__@H_301_19@、__FUNCTION__@H_301_19@、__LINE__
//? 用在模式中的关键字: _
//? @H_301_19@特定上下文中被保留的关键字: associativity@H_301_19@、didSet@H_301_19@、get@H_301_19@、infix@H_301_19@、inout@H_301_19@、left@H_301_19@、mutating@H_301_19@、none@H_301_19@、non mutating@H_301_19@、operator@H_301_19@、override@H_301_19@、postfix@H_301_19@、precedence@H_301_19@、prefix@H_301_19@、right@H_301_19@、set@H_301_19@、unowned@H_301_19@、unowned(safe)@H_301_19@、unowned(unsafe)@H_301_19@、weak@H_301_19@、willSet,@H_301_19@这些关键字在特定上下文之外可以被用于标识符。
//@H_301_19@以下标记被当作保留符号,@H_301_19@不能用于自定义操作符: ( @H_301_19@、 ) @H_301_19@、 { @H_301_19@、 } @H_301_19@、 [ @H_301_19@、 ] @H_301_19@、 . @H_301_19@、,@H_301_19@、 : @H_301_19@、 ; @H_301_19@、 = @H_301_19@、 @ @H_301_19@、 # @H_301_19@、 &(@H_301_19@作为前缀操作符) @H_301_19@、 -> @H_301_19@、``@H_301_19@、 ? @H_301_19@和 !(@H_301_19@作为后缀操作符)`@H_301_19@。
/*@H_301_19@字面量***********************************************/
//? @H_301_19@空字符(Null Character) \0
//? @H_301_19@反斜线(Backslash) \\
//? @H_301_19@水平制表符(Horizontal Tab) \t
//? @H_301_19@换行符(Line Feed) \n
//? @H_301_19@回车符(Carriage Return) \r
//? @H_301_19@双引号(Double Quote) \"
//? @H_301_19@单引号(Single Quote) \'
//? Unicode@H_301_19@标量 \u{n},n@H_301_19@为一到八位的十六进制数字
/*@H_301_19@运算符***********************************************/
//- 、 + 、 ! 、 * 、 % 、 < 、 > 、 & 、 | 、 ^ 、 ? 以及 ~,或者后面语法中规定的任一个 Unicode 字符开始。在第一个字符之后,允许使用组合型 Unicode 字符。也可以使用两个或者多个的点号来自定义运算符(比 如,.... )。虽然可以自定义包含问号 ? 的运算符,但是这个运算符不能只包含单独的一个问号。
//? 如果运算符两侧都有空白或两侧都无空白,将被看作二元运算符。例如: a+b 和 a + b 中的运算符 + 被 看作二元运算符。
//? 如果运算符只有左侧空白,将被看作前缀一元运算符。例如 a ++b 中的 ++ 被看作前缀一元运算符。
//? 如果运算符只有右侧空白,将被看作后缀一元运算符。例如 a++ b 中的 ++ 被看作后缀一元运算符。
//? 如果运算符左侧没有空白并紧跟 .,将被看作后缀一元运算符。例如 a++.b 中的 ++ 被看作后缀一元运 算符(即上式被视为 a++ .b 而非 a ++ .b )。
//鉴于这些规则,运算符前的字符 (、[ 和 { ;运算符后的字符 )、] 和 } 以及字符,、; 和 : 都被视为 空白。