语法总结


词法结构

空白语法

空白  → 空白项 空白 opt

空白项  → 断行符

空白项  → 注释

空白项  → 多行注释

空白项  →U+0000, U+0009, U+000B, U+000C, 或者 U+0020

断行符  → U+000A

断行符  → U+000D

断行符  → U+000D 接着是 U+000A

注释  → // 注释内容 断行符

多行注释 → /* 多行注释内容 */

注释内容  → 注释内容项 注释内容 opt

注释内容项  → 任何 Unicode 标量值, 除了 U+000A 或者 U+000D

多行注释内容  → 多行注释内容项 多行注释内容 opt

多行注释内容项  → 多行注释

多行注释内容项  → 注释内容项

多行注释内容项  → 任何 Unicode 标量值, 除了 /* 或者 */

标识符语法

标识符  → 头部标识符标识符字符组 opt

标识符  → ` 头部标识符 标识符字符组 opt `

标识符  → 隐式参数名

标识符列表  → 标识符标识符 , 标识符列表

头部标识符  →大写或小写字母 A - Z 头部标识符

头部标识符  → _

头部标识符  →U+00A8, U+00AA, U+00AD, U+00AF, U+00B2--U+00B5, 或者 U+00B7--U+00BA

头部标识符  →U+00BC--U+00BE, U+00C0--U+00D6, U+00D8--U+00F6, 或者 U+00F8--U+00FF

头部标识符  →U+0100--U+02FF, U+0370--U+167F, U+1681--U+180D, 或者 U+180F--U+1DBF

头部标识符  →U+1E00--U+1FFF

头部标识符  →U+200B--U+200D, U+202A--U+202E, U+203F--U+2040, U+2054, 或者 U+2060--U+206F

头部标识符  →U+2070--U+20CF, U+2100--U+218F, U+2460--U+24FF, 或者 U+2776--U+2793

头部标识符  →U+2C00--U+2DFF 或者 U+2E80--U+2FFF

头部标识符  →U+3004--U+3007, U+3021--U+302F, U+3031--U+303F, 或者 U+3040--U+D7FF

头部标识符  →U+F900--U+FD3D, U+FD40--U+FDCF, U+FDF0--U+FE1F, 或者 U+FE30--U+FE44

头部标识符  →U+FE47--U+FFFD

头部标识符  →U+10000--U+1FFFD, U+20000--U+2FFFD, U+30000--U+3FFFD, 或者 U+40000--U+4FFFD

头部标识符  →U+50000--U+5FFFD, U+60000--U+6FFFD, U+70000--U+7FFFD, 或者 U+80000--U+8FFFD

头部标识符  →U+90000--U+9FFFD, U+A0000--U+AFFFD, U+B0000--U+BFFFD, 或者 U+C0000--U+CFFFD

头部标识符  →U+D0000--U+DFFFD 或者 U+E0000--U+EFFFD

标识符字符组  → 数值 0 - 9

标识符字符组  → U+0300--U+036F, U+1DC0--U+1DFF, U+20D0--U+20FF, 或者 U+FE20--U+FE2F

标识符字符组  → 头部标识符

标识符字符组  → 标识符字符组 标识符字符组 opt

隐式参数名  → $ 十进制数字列表

字面量语法

字面量  → 数值字面量 | 字符串字面量 | 布尔值字面量 | nil字面量

数值字面量  → -opt 整数字面量 | -opt 浮点数字面量

布尔值字面量  → truefalse

nil字面量  → nil


整数字面量语法

整数字面量  → 二进制字面量

整数字面量  → 八进制字面量

整数字面量  → 十进制字面量

整数字面量  → 十六进制字面量

二进制字面量  → 0b二进制数字 二进制字面量字符组 opt

二进制数字  → 数值 0 到 1

二进制字面量字符组  → 二进制数字 | _

二进制字面量字符组  → 二进制字面量字符组 二进制字面量字符组 opt

八进制字面量  → 0o 八进制数字 八进制字面量字符组 opt

八进制数字  → 数值 0 到 7

八进制字面量字符组  → 八进制数字 | _

八进制字面量字符组  → 八进制字面量字符组 八进制字面量字符组 opt

十进制字面量  → 十进制数字 十进制字面量字符组 opt

十进制数字  → 数值 0 到 9

十进制数字  → 十进制数字 十进制数字 opt

十进制字面量字符组  → 十进制数字 | _

十进制字面量字符组  → 十进制字面量字符组 十进制字面量字符组 opt

十六进制字面量 → 0x 十六进制数字 十六进制字面量字符组 opt

十六进制数字  →数值 0 到 9, 字母 a 到 f, 或 A 到 F

十六进制字面量字符组  → 十六进制数字 | _

十六进制字面量字符组  → 十六进制字面量字符组 十六进制字面量字符组 opt

浮点数字面量语法

浮点数字面量  → 十进制字面量 十进制分数 opt 十进制指数 opt

浮点数字面量  → 十六进制字面量 十六进制分数 opt 十六进制指数

十进制分数  → . 十进制字面量

十进制指数 → 浮点数e 签名 opt 十进制字面量

十六进制分数  → . 十六进制数字 十六进制字面量字符组 opt

十六进制指数  → 浮点数p 签名 opt 十进制字面量

浮点数e  → eE

浮点数p  → pP

签名  → + | -


字符串字面量语法

字符串字面量  → 静态字符串字面量 | 插值字符串字面量

静态字符串字面量 → " 引用文本 opt "

静态字符串字面量 → """ 多行引用文本 opt """

引用文本  → 引用文本项 引用文本 opt

引用文本项  → 转义字符

引用文本项  →除了以外的所有 Unicode 字符"\, U+000A, 或者 U+000D

多行引用文本  → 多行引用文本项 多行引用文本 opt

多行引用文本项  → 转义字符

多行引用文本项  → 除了以外的所有 Unicode 字符 \

多行引用文本项  → 转义字符

插值字符串字面量  → " 插值文本 opt "

插值字符串字面量  → """ 多行引用文本 opt """

插值文本  → 插值文本项 插值文本 opt

插值文本项  → \( 表达式 ) | 引用文本项

多行插值文本  → 多行插值文本项 多行插值文本 opt

多行插值文本项  → \( 表达式 ) | 多行引用文本项

转义字符 → \0 | \\ | \t | \n | \r | \" | \'

转义字符 → \u {  Unicode 标量数字 }

Unicode 标量数字  → 在1到8个十六进制数字之间

转义换行  → \ 空白区 opt 断行符

运算符语法

运算符  → 头部运算符运算符字符组 opt

运算符  → 头部点运算符 头部点运算符字符组

头部运算符  → / |= | - | + | ! | * | % | < | > | & | | | ^ | ~ | ?

头部运算符  →U+00A1--U+00A7

头部运算符  →U+00A9 或者 U+00AB

头部运算符  →U+00AC 或者 U+00AE

头部运算符  →U+00B0--U+00B1, U+00B6, U+00BB, U+00BF, U+00D7, 或者 U+00F7

头部运算符  →U+2016--U+2017 或者 U+2020--U+2027

头部运算符  →U+2030--U+203E

头部运算符  →U+2041--U+2053

头部运算符  →U+2055--U+205E

头部运算符  →U+2190--U+23FF

头部运算符  →U+2500--U+2775

头部运算符  →U+2794--U+2BFF

头部运算符  →U+2E00--U+2E7F

头部运算符  →U+3001--U+3003

头部运算符  →U+3008--U+3030

运算符字符组 → 头部运算符

运算符字符组 → U+0300--U+036F

运算符字符组 → U+1DC0--U+1DFF

运算符字符组 → U+20D0--U+20FF

运算符字符组 → U+FE00--U+FE0F

运算符字符组 → U+FE20--U+FE2F

运算符字符组 → U+E0100--U+E01EF

运算符字符组  → 运算符字符组  运算符字符组  opt

头部点运算符 → .

点运算符字符组  → . | 运算符字符组

点运算符字符组  → 点运算符字符组 点运算符字符组 opt

二元运算符  → 运算符

前缀运算符  → 运算符

前缀运算符  → 运算符


类型

类型语法

类型  → 数组类型

类型  → 字典类型

类型  → 函数类型

类型  → 类型标识

类型  → 元组类型

类型  → 可选类型

类型  → 隐式解析可选类型

类型  → 协议合成类型

类型  → 元型类型

类型  → 任意类型

类型  → 自身类型

类型  → ( 类型 )


类型注解语法

类型注解  → :特性列表 opt 输入输出参数opt 类型


类型标识符语法

类型标识符  → 类型名称 泛型参数子句 opt | 类型名称 泛型参数子句 opt . 类型标识符

类型名称  → 标识符


元组类型语法

元组类型  → ( ) | (元组类型语法 , 元组类型元素列表 )

元组类型元素列表  → 元组类型元素 | 元组类型元素 , 元组类型元素列表

元组类型元素  → 元素名称 类型注解 | 类型

元素名称  → 标识符

函数类型语法

函数类型  → 特性列表 opt 函数类型参数子句throwsopt -> 类型

函数类型  → 特性列表 opt 函数类型参数子句 rethrows -> 类型

函数类型参数子句  → ( )

函数类型参数子句  → ( 函数类型参数列表 ...opt )

函数类型参数列表  → 函数类型参数 | 函数类型参数 ,函数类型参数列表

函数类型参数  → 特性列表 opt inoutopt 类型 | 参数标签 类型注解

参数标签  → 标识符


数组类型语法

数组类型  → [ 类型 ]


字典类型语法

字典类型  → [类型 : 类型 ]


可选类型语法

可选类型  → 类型 ?


隐式解析可选类型语法

隐式解析可选类型  → 类型 !


协议合成类型语法

协议合成类型  → 类型 & 协议合成延续

协议合成延续  → 类型标识符 | 协议合成类型


元类型语法

元类型  → 类型. Type | 类型 . Protocol


类型继承子句语法

类型继承子句  → : 类型继承列表

类型继承列表  → 类型标识符 | 类型标识符 , 类型继承列表


表达式

表达式语法

表达式  → try运算符 opt 前缀表达式 二元表达式 opt

表达式列表  → 表达式 | 表达式 , 表达式列表


前缀表达式语法

前缀表达式  → 前缀表达式 opt 前缀表达式

前缀表达式  → 输入输出表达式

输入输出表达式  → & 标识符


try 表达式语法

try 表达式  → try |try ? | try !


二元表达式语法

二元表达式  → 二元运算符 前缀运算符

二元表达式  → 赋值运算符  try 运算符 opt 前缀表达式

二元表达式  → 条件运算符  try 表达式 opt 前缀表达式

二元表达式  → 类型转换表达式

二元表达式 → 二元表达式 二元表达式 opt


赋值表达式语法

赋值表达式  → =

条件运算符语法

条件运算符  → ? 表达式 :


类型转换运算符语法

类型转换运算符  → is 类型

类型转换运算符  → as 类型

类型转换运算符  → as ? 类型

类型转换运算符  → as ! 类型


基本表达式语法

基本表达式  → 标识符 泛型参数子句 opt

基本表达式  → 字面量表达式

基本表达式  →  self 表达式

基本表达式  → 超类表达式

基本表达式  → 闭包表达式

基本表达式  → 圆括号表达式

基本表达式  → 元组表达式

基本表达式  → 隐式成员表达式

基本表达式  → 通配符表达式

基本表达式  → key-path表达式

基本表达式  → 选择器表达式

基本表达式  → key-path字符串表达式


字面量表达式语法

字面量表达式  → 字面量

字面量表达式  → 数组字面量 | 字典字面量 | 练习场字面量

字面量表达式  → #file | #line | #column | #function

数组字面量  → [ 数组字面量项 opt ]

数组字面量项  → 数组字面量项 ,opt | 数组字面量项 , 数组字面量项

数组字面量项  → 表达式

字典字面量  → [ 字典字面量项 ] | [ : ]

字典字面量项  → 字典字面量项 ,opt | 字典字面量项, 字典字面量项

字典字面量项  → 表达式 : 表达式

练习场字面量  → #colorLiteral ( red : 表达式 , green : 表达式 , blue :表达式 , alpha : 表达式 )

练习场字面量  → #fileLiteral ( resourceName : 表达式 )

练习场字面量  → #imageLiteral ( resourceName : 表达式 )

self 表达式语法

self 表达式  → self |  self 方法表达式 |  self 下标表达式 |  self 构造器表达式

self 方法表达式  → self . 标识符

self 下标表达式  → self [ 函数调用参数列表 ]

self 初始化表达式  → self . init


父类表达式语法

超类表达式  → 超类方法表达式 | 超类下标表达式 | 超类初始化表达式

超类方法表达式  → super . 标识符

超类下标表达式  → super [ 函数调用参数列表 ]

超类初始化表达式  → super . init


闭包表达式语法

闭包表达式 → { 闭包签名 opt 声明 opt }

闭包签名  → 闭包列表 opt 闭包参数子句 throwsopt函数结果 opt in

闭包签名  → 闭包列表 in

闭包参数子句  → ( ) | ( 闭包参数 ) | 标识符列表

闭包参数列表  → 闭包参数 | 闭包参数 , 闭包参数列表

闭包参数 → 闭包参数名称 类型注解 opt

闭包参数 → 闭包参数名称 类型注解 ...

闭包参数名称  → 标识符

闭包列表  → [闭包列表项 ]

闭包列表项 → 闭包列表项 | 闭包列表项 , 闭包列表项

闭包列表项  → 捕获说明符 opt 表达式

捕获说明符  → weak | unowned | unowned(safe) | unowned(unsafe)

隐式成员表达式语法

隐式成员表达式  → . 标识符


圆括号表达式语法

圆括号表达式  → ( 表达式 )


元组表达式语法

元组表达式  → ( ) | ( 元组元素 , 元组元素列表 )

元组元素列表 → 元组元素 | 元组元素 , 元组元素列表

元组元素  → 表达式 | 标识符 : 标识符


通配符表达式语法

通配符表达式  → _


key-path 表达式语法

key-path 表达式  → \ 类型 opt .  key-path 组件

key-path 组件  → key-path 组件 | key-path 组件 . key-path 组件

key-path 组件  → 标识符  key-path 后缀 opt |  key-path 后缀

key-path 后缀 →  key-path 后缀  key-path 后缀 opt

key-path 后缀  → ? | ! | [ 函数调用参数列表 ]

选择器表达式语法

选择器表达式  → #selector ( 表达式 )

选择器表达式  → #selector ( getter: 表达式 )

选择器表达式  → #selector ( setter: 表达式 )


key-path 字符串表达式语法

key-path 字符串表达式  → #keyPath ( 表达式 )


后缀表达式语法

后缀表达式 → 基本表达式

后缀表达式 → 后缀表达式 后缀运算符

后缀表达式 → 函数调用表达式

后缀表达式 → 初始化表达式

后缀表达式 → 显式成员表达式

后缀表达式 → 后缀 self 表达式

后缀表达式 → 下标表达式

后缀表达式 → 强制取值表达式

后缀表达式 → 可选链表达式


函数调用表达式语法

函数调用表达式  → 后缀表达式 函数调用参数子句

函数调用表达式  → 后缀表达式 函数调用参数子句 opt 尾随闭包

函数调用参数子句  → ( ) | ( 函数调用参数列表 )

函数调用参数列表  → 函数调用参数 | 函数调用参数 ,函数调用参数列表

函数调用参数  → 表达式 | 标识符 : 表达式

函数调用参数  → 运算符 | 标识符 : 运算符

尾随闭包  → 闭包表达式

初始化表达式语法

初始化表达式  → 后缀表达式 . init

初始化表达式  → 后缀表达式 . init ( 参数名称 )


显式成员表达式语法

显式成员表达式  → 后缀表达式 . 十进制数字

显式成员表达式  → 后缀表达式 . 标识符 泛型参数子句 opt

显式成员表达式  → 后缀表达式 . 标识符 ( 参数名称 )

参数名称  → 参数名称 参数名称 opt

参数名称  → 标识符 :


后缀 self 表达式语法

后缀 self 表达式  → 后缀表达式 . self


下标表达式语法

下标表达式  → 后缀表达式 [ 函数调用参数列表 ]


强制取值表达式语法

强制取值表达式  → 后缀表达式 !


可选链表达式语法

可选链表达式  → 后缀表达式 ?


语句

语句语法

语句  → 表达式 ;opt

语句  → 语句 ;opt

语句  → 循环语句 ;opt

语句  → 分支语句 ;opt

语句  → 标签语句 ;opt

语句  → 控制转移语句 ;opt

语句  →  defer 语句 ;opt

语句  →  do 语句;opt

语句  → 编译器控制语句

语句  → 语句语句 opt


循环语句语法

循环语句  →  for-in 语句

循环语句  →  while 语句

循环语句  →  repeat-while 语句


for-in 语句语法

for-in 语句  → for caseopt 模式 in 表达式 where 子句 opt code 块


while 语句语法

while 语句  → while 条件列表 code 块

条件列表  → 条件 | 条件 , 条件列表

条件  → 表达式 | 可用性条件 | case 条件 | 任选约束条件

case 条件  → case 模式 初始化

任选约束条件  → let 模式 初始化 | var 模式 初始化

repeat-while 语句语法

repeat-while 语句  → repeat  code 块 while 表达式


分支语句语法

分支语句 →  if 语句

分支语句 →  guard 语句

分支语句 →  switch 语句


if 语句语法

if 语句  → if条件列表  code 块  else 子句 opt

else 子句  → else code 块 | else  if 语句


guard 语句语法

guard 语句  → guard 条件列表 else  code 块


switch 语句语法

switch 语法  → switch 表达式 {  switch 子句 opt }

switch 子句  →  switch 子句  switch 子句 opt

switch 子句  →  case 标签语句 |  default 标签 语句

case 标签  → case  case 项列表 :

case 项列表  → 模式 where 子句 opt | 模式  where 子句 opt , case 项列表

default 标签  → default :

where 子句  → where where 表达式

where 表达式  → 表达式

标签语句语法

标签语句 → 语句标签  loop 语句

标签语句 → 语句标签  if 语句

标签语句 → 语句标签  switch 语句

标签语句 → 语句标签  do 语句

语句标签  → 标签名称 :

标签名称  → 标识符


控制转移语句语法

控制转移语句  →  break 语句

控制转移语句  →  continue 语句

控制转移语句  →  fallthrough 语句

控制转移语句  →  return 语句

控制转移语句  →  throw 语句


break 语句语法

break 语句  → break 标签名称 opt


continue 语句语法

continue 语句  → continue 标签名称 opt


fallthrough 语句语法

fallthrough 语句  → fallthrough

return 语句语法

return 语句  → return 表达式 opt


throw 语句语法

throw 语句  → throw 表达式


defer 语句语法

defer 语句  → defer  code 块


do 语句语法

do 语句  → do code 块  catch 子句 opt

catch 子句  →  catch 子句  catch 子句 opt

catch 子句  → catch模式 opt  where 子句 opt  code 块


编译控制语句语法

编译控制语句  → 条件编译块

编译控制语句  → 线路控制语句

编译控制语句  → 诊断语句

条件编译块语法

条件编译块  →  if 指令子句  elseif 指令子句 opt  else 指令子句 opt  endif 指令子句

if 指令子句 →  if 指令 编译条件 声明 opt

elseif 指令子句  →  elseif 指令子句  elseif 指令子句 opt

elseif 指令子句  →  elseif 指令 编译条件 声明 opt

else 指令子句  →  else 指令 声明 opt

if 指令  → #if

elseif 指令  → #elseif

else 指令  → #else

endif 指令  → #endif

编译条件  → 平台条件

编译条件  → 标识符

编译条件  →  boolean 字面量

编译条件  → ( 编译条件 )

编译条件  → ! 编译条件

编译条件  → 编译条件 && 编译条件

编译条件  → 编译条件 || 编译条件

平台条件 → os ( 操作系统 )

平台条件 → arch ( 结构 )

平台条件 → swift ( >= swift 版本 )

平台条件 → canImport ( 模块名称 )

平台条件 → targetEnvironment ( 运行环境 )

操作系统  → macOS | iOS | watchOS | tvOS

运行环境  → i386 |x86_64 | arm | arm64

swift 版本  → 十进制数字  swift 拓展版本 opt

swift 拓展版本  → . 十进制数字  swift 拓展版本 opt

模块名称  → 标识符

运行环境  → simulator

线路控制声明语法

线路控制声明  → #sourceLocation ( file: file-name , line: 行号 )

线路控制声明  → #sourceLocation ( )

行号  → A decimal integer greater than zero

文件名  → 静态字符串字面量


编译时诊断声明语法

编译时诊断声明  → #error ( 诊断信息 )

诊断声明  → #warning ( 诊断信息 )

诊断信息  → 静态字符串字面量


可用性条件语法

可用性条件  → #available ( 可用性参数 )

可用性参数  → 可用性参数 | 可用性参数 , 可用性参数

可用性参数  → 平台名称 平台版本

可用性参数  → *

平台名称  → iOSiOSApplicationExtension

平台名称  → macOS | macOSApplicationExtension

平台名称  → watchOS

平台名称  → tvOS

平台版本  → 十进制数字

平台版本  → 十进制数字 . 十进制数字

平台版本  → 十进制数字 . 十进制数字 . 十进制数字


声明

声明语法

声明  → 导入声明

声明  → 常量声明

声明  → 变量声明

声明  → 类型别名声明

声明  → 函数声明

声明  → 枚举声明

声明  → 结构体声明

声明  → 类声明

声明  → 协议声明

声明  → 初始化器声明

声明  → 去初始化器声明

声明  → 扩展声明

声明  → 下标声明

声明  → 运算符声明

声明  → 优先组声明

声明  → 声明 声明 opt


顶级声明语法

顶级声明  → 声明 opt


code 块语法

code 块  → {声明 opt }


导入声明语法

导入声明 → 特性列表 opt import 导入类型 opt 导入路径

导入类型  → typealiasstruct | class | enum | protocol | let | var | func

导入路径  → 导入路径标识符 | 导入路径标识符 . 导入路径

导入路径标识符  → 标识符 | 运算符


常量声明语法

常量声明  → 特性列表 opt 声明修饰符列表 opt let模式构造器列表

模式构造器列表  → 模式初始化 | 模式初始化 , 模式初始化列表

模式初始化  → 模式 初始化 opt

初始化  → = 表达式

变量声明语法

变量声明  → 变量声明头 模式初始化器列表

变量声明  → 变量声明头 变量名称 类型标注 代码块

变量声明  → 变量声明头 变量名称 类型标注  getter-setter 代码块

变量声明  → 变量声明头 变量名称 类型标注  getter-setter-keyword 代码块

变量声明  → 变量声明头 变量名称 构造器  willSet-didSet 代码块

变量声明  → 变量声明头 变量名称 类型标注 构造器 opt  willSet-didSet 代码块

变量声明头  → 特性列表 opt 声明修饰符列表 opt var

变量名称  → 标识符

getter-setter 代码块  → 代码块

getter-setter 代码块  → {  getter 子句  setter 子句 opt }

getter-setter 代码块  → {  setter 子句  getter 子句 }

getter 子句  → 特性列表 opt 声明修饰符列表 opt get 代码块

setter 子句  → 特性列表 opt 声明修饰符列表 opt set  setter 名称 opt 代码块

setter 名称  → (标识符 )

getter-setter-keyword 代码块  → {  getter-keyword 子句  setter-keyword 子句 opt }

getter-setter-keyword 代码块  → {  setter-keyword 子句  getter-keyword 子句 }

getter-keyword 子句  → 特性列表 opt 声明修饰符列表 optget

setter-keyword 子句  → 特性列表 opt 声明修饰符列表 optset

willSet-didSet 代码块  → {  willSet 子句  didSet 子句 opt }

willSet-didSet 代码块  → {  didSet 子句  willSet 子句 opt }

willSet 子句  → 特性列表 opt willSet  setter 名称 opt 代码块

didSet 子句  → 特性列表 opt didSet  setter 名称 opt 代码块

类型别名声明语法

类型别名声明  → 特性列表 opt 访问级别修饰符 opttypealias 类型别名名称 泛型形参子句 opt 类型别名名称

类型别名名称  → 标识符

类型别名赋值  → = 类型


函数声明语法

函数声明  → 函数头 函数名 泛型形参子句 opt函数签名 泛型 where 子句 opt 函数体 opt

函数头  → 特性列表 opt 声明修饰符列表 opt func

函数名  → 标识符 | 运算符

函数签名 → 参数子句 throwsopt 函数结果 opt

函数签名 → 参数子句 rethrows 函数结果 opt

函数结果  → ->特性列表 opt 类型

函数体  → 代码块

参数子句  → ( ) | ( 参数列表 )

参数列表  → 参数 | 参数 , 参数列表

参数  → 外部参数名 opt 内部参数名 类型标注默认参数子句 opt

参数  → 外部参数名 opt 内部参数名 类型标注

参数  → 外部参数名 opt 内部参数名 类型标注 ...

外部参数名  → 标识符

内部参数名  → 标识符

默认参数子句  → = 表达式

枚举声明语法

枚举声明  → 特性列表 opt 访问级别修饰符 opt 联合风格枚举

枚举声明  → 特性列表 opt 访问级别修饰符 opt 原始值风格枚举

联合风格枚举  → indirectopt enum 枚举名称 泛型形参子句 opt 类型继承子句 opt 泛型 where 子句 opt { 联合风格枚举成员 opt }

联合风格枚举成员  → 联合风格枚举成员 联合风格枚举成员 opt

联合风格枚举成员  → 声明 | 联合风格枚举用例子句 | 编译控制语法

联合风格枚举用例子句  → 特性列表 optindirectopt case 联合风格枚举用例列表

联合风格枚举用例列表  → 联合风格枚举用例 | 联合风格枚举用例 ,联合风格枚举用例列表

联合风格枚举用例  → 枚举用例名称 元组类型 opt

枚举名称  → 标识符

枚举用例名称  → 标识符

原始值风格枚举  → enum 枚举名称 泛型形参子句 opt类型继承子句 泛型 where 子句 opt { 原始值风格枚举成员 }

原始值风格枚举成员  → 原始值风格枚举成员 原始值风格枚举成员 opt

原始值风格枚举成员  → 声明 | 原始值风格枚举用例子句 | 编译控制语法

原始值风格枚举用例子句  → 特性列表 opt case 原始值风格枚举用例列表

原始值风格枚举用例列表  → 原始值风格枚举用例 | 原始值风格枚举用例 , 原始值风格枚举用例列表

原始值风格枚举用例  → 枚举用例名称 原始值赋值 opt

原始值赋值  → = 原始值字面量

原始值字面量  → 数字字面量 | 静态字符串字面量 | 布尔字面量

结构体声明语法

结构体声明 → 特性列表 opt 访问级别修饰符 opt struct结构体名称 泛型形参子句 opt 类型继承子句 opt 泛型 where 子句 opt 结构体主体

结构体名称  → 标识符

结构体主体  → { 结构体成员 opt }

结构体成员  → 结构体成员 结构体成员 opt

结构体成员  → 声明 | 编译控制语法


类声明语法

类声明  → 特性列表 opt 访问级别修饰符 optfinalopt class 类名 泛型形参子句 opt 类型继承子句 opt 泛型 where 子句 opt 类主体

类声明  → 特性列表 opt final 访问级别修饰符 optclass 类名 泛型形参子句 opt 类型继承子句 opt 泛型 where 子句 opt 类主体

类名  → 标识符

类主体  → { 类成员 opt }

类成员  → 类成员 类成员 opt

类成员  → 声明 | 编译控制语法


协议声明语法

协议声明  → 特性列表 opt 访问级别修饰符 optprotocol 协议名称 类型继承子句 opt 泛型 where 子句 opt 协议主体

协议名称  → 标识符

协议主体  → {协议成员 opt }

协议成员 → 协议成员 协议成员 opt

协议成员  → 协议成员声明 | 编译控制语法

协议成员声明  → 协议属性声明

协议成员声明  → 协议方法声明

协议成员声明  → 协议构造器声明

协议成员声明  → 协议下标声明

协议成员声明  → 协议关联类型声明

协议成员声明  → 类型别名声明

协议属性声明语法

协议属性声明  → 变量声明头 变量名称 类型标注  getter-setter-keyword 代码块


协议方法声明语法

协议方法声明  → 函数头 函数名 泛型形参子句 opt 函数签名 泛型 where 子句 opt


协议构造器声明语法

协议构造器声明  → 构造器头 泛型形参子句 opt 参数子句 throwsopt 泛型 where 子句 opt

协议构造器声明  → 构造器头 泛型形参子句 opt 参数子句 rethrows 泛型 where 子句 opt


协议下标声明语法

协议下标声明  → 下标头 下标结果 泛型 where 子句 opt  getter-setter-keyword 代码块


协议关联类型声明语法

协议关联类型声明  → 特性列表 opt 访问级别修饰符 optassociatedtype 类型别名名称 类型继承子句 opt类型别名赋值 opt 泛型 where 子句 opt


构造器声明语法

构造器声明  → 构造器头 泛型形参子句 opt 参数子句 throwsopt 泛型 where 子句 opt构造器主体

构造器声明  → 构造器头 泛型形参子句 opt 参数子句 rethrows 泛型 where 子句 opt 构造器主体

构造器头  → 特性列表 opt 声明修饰符 opt init

构造器头  → 特性列表 opt 声明修饰符 opt init ?

构造器头  → 特性列表 opt 声明修饰符 opt init !

构造器主体  → 代码块


析构器声明语法

析构器声明  → 特性列表 opt deinit 代码块


扩展声明语法

扩展声明  → 特性列表 opt 访问级别修饰符 opt extension 类型标识符 类型继承子句 opt 泛型 where 子句 opt 扩展主体

扩展主体  → {扩展成员 opt }

扩展成员  → 扩展成员 扩展成员 opt

扩展成员 → 声明 | 编译控制语法


下标声明语法

下标声明  → 下标头 下标结果 泛型 where 子句 opt代码块

下标声明  → 下标头 下标结果 泛型 where 子句 opt getter-setter 代码块

下标声明  → 下标头 下标结果 泛型 where 子句 opt getter-setter-keyword 代码块

下标头  → 特性列表 opt 声明修饰符 opt subscript泛型形参子句 opt 参数子句

下标结果  → -> 特性列表 opt 类型

运算符声明语法

运算符声明  → 前缀运算符声明 | 前缀运算符声明 | 后缀运算符声明

前缀运算符声明  → prefix operator 运算符

前缀运算符声明  → postfix operator 运算符

后缀运算符声明  → infix operator 运算符 后缀运算符组 opt

后缀运算符组  → : 优先级组名称


优先级组声明语法

优先级组声明  → precedencegroup 优先级组名称 {优先级组属性 opt }

优先级组属性  → 优先级组属性 优先级组属性 opt

优先级组属性  → 优先级组关系

优先级组属性  → 优先级组赋值性

precedence-group-attribute  → 优先级组相关性

优先级组关系  → higherThan : 优先级组名称

优先级组关系  → lowerThan : 优先级组名称

优先级组赋值性  → assignment : 布尔字面量

优先级组相关性  → associativity : left

优先级组相关性  → associativity : right

优先级组相关性  → associativity : none

优先级组名称  → 优先级组名称 | 优先级组名称 ,优先级组名称

优先级组名称  → 标识符

声明修饰符语法

声明修饰符  → class | convenience | dynamic | final | infix | lazy | optional |override | postfix | prefix | required | static | unowned | unowned ( safe ) | unowned ( unsafe ) | weak

声明修饰符  → 访问级别修饰符

声明修饰符  → 转义修饰符

声明修饰符  → 声明修饰符 声明修饰符 opt

访问级别修饰符  → private | private ( set )

访问级别修饰符  → fileprivate | fileprivate ( set )

访问级别修饰符  → internal | internal ( set )

访问级别修饰符  → public | public ( set )

访问级别修饰符  → open | open ( set )

转义修饰符 → mutating | nonmutating


特性

特性语法

特性  → @ 特性名 特性参数子句 opt

特性名  → 标识符

特性参数子句  → ( 平衡令牌 opt )

特性  → 特性特性 opt

平衡令牌  → 平衡令牌 平衡令牌 opt

平衡令牌  → (平衡令牌 opt )

平衡令牌  → [平衡令牌 opt ]

平衡令牌  → {平衡令牌 opt }

平衡令牌  → 任何标识符、关键字、文字或运算符

平衡令牌  → 任何标点符号除外 ()[]{, 或者 }


模式

模式语法

模式  → 通配符模式类型标注 opt

模式  → 标识符模式类型标注 opt

模式  → 值绑定模式

模式  → 元组模式 类型标注 opt

模式  → 枚举用例模式

模式  → 可选模式

模式  → 类型转换模式

模式  → 表达式模式


通配符模式语法

通配符模式  → _


标识符模式语法

标识符模式  → identifier


值绑定模式语法

值绑定模式  → var 模式 | let 模式


元组模式语法

元组模式  → (元组模式元素列表 opt )

元组模式元素列表  → 元组模式元素 | 元组模式元素 , 元组模式元素列表

元组模式元素  → 模式 | 标识符 : 模式


枚举用例模式语法

枚举用例模式  → 类型标识符 opt . 枚举用例名 元组模式 opt


可选模式语法

可选模式  → 标识符模式 ?

类型转换模式语法

类型转换模式  →  is 模式 |  as 模式

is 模式  → is 类型

as 模式  → 模式 as类型


表达式模式语法

表达式模式 → 表达式


泛型参数

泛型形参子句语法

泛型形参子句  → < 泛型形参列表 >

泛型形参列表  → 泛型形参 | 泛型形参 , 泛型形参列表

泛型形参 → 类名

泛型形参 → 类名 : 类型标识符

泛型形参 → 类名 : 协议合成类型

泛型 where 子句  → where 约束列表

约束列表  → 约束 | 约束 , 约束列表

约束  → 一致性约束 | 同类型约束

一致性约束  → 类型标识符 : 类型标识符

同类型约束  → 类型标识符 : 协议合成类型

同类型约束  → 类型标识符 == 类型


泛型实参子句语法

泛型实参子句  → < 泛型实参列表 >

泛型实参列表  → 泛型实参 | 泛型实参 , 泛型实参列表

泛型实参 → 类型

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~