?
u
m
/
p
1-9
0
`
ECMAScript
在若干情形下,词法输入元素的识别会对消费这些输入元素的句法语法上下文敏感,因此词法语法需要多个
使用多个词法目标可确保不存在会影响自动分号插入的词法二义性。例如,没有任何句法语境同时允许以除法或除法赋值开头以及以
a = b
/hi/g.exec(c).map(d);
当一个
a = b / hi / g.exec(c).map(d);
Unicode 格式控制字符(即 Unicode 字符数据库中类别 “Cf” 的字符,例如 LEFT-TO-RIGHT MARK 或 RIGHT-TO-LEFT MARK)是用于在缺乏更高层协议(如标记语言)时控制一段文本排版的控制码。
允许在源码文本中使用格式控制字符有助于编辑与显示。所有格式控制字符可出现在注释中,以及字符串字面量、模板字面量和正则表达式字面量中。
U+FEFF (ZERO WIDTH NO-BREAK SPACE) 是一种主要用于文本开头以标记其为 Unicode 并允许检测编码与字节序的格式控制字符。用于该目的的 <ZWNBSP> 字符有时也可能在文本开头之后出现,例如连接文件的结果。在 ECMAScript 源码文本中,除注释、字符串字面量、模板字面量和正则表达式字面量外,<ZWNBSP> 码点被视为空白字符(见
空白码点用于提升源码可读性并分隔记号(不可再分的词法单元),除此之外没有意义。空白码点可出现在任意两个记号之间以及输入开头或结尾。空白码点可出现在
ECMAScript 的空白码点列于
Code Points | 名称 (Name) | 缩写 (Abbreviation) |
---|---|---|
U+0009
|
CHARACTER TABULATION | <TAB> |
U+000B
|
LINE TABULATION | <VT> |
U+000C
|
FORM FEED (FF) | <FF> |
U+FEFF
|
ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
any code point in general category “Space_Separator” | <USP> |
U+0020 (SPACE) 与 U+00A0 (NO-BREAK SPACE) 码点属于 <USP>。
除
与空白码点类似,行终止符码点用于提升源码可读性并分隔记号。但与空白码点不同,行终止符会对句法语法行为产生影响。一般而言,行终止符可出现在任意两个记号之间,但也有少数位置为句法语法所禁止。行终止符还影响自动分号插入过程(见
行终止符包含在正则表达式 \s
类所匹配的空白码点集合中。
ECMAScript 行终止符码点列于
Code Point | Unicode 名称 (Unicode Name) | 缩写 (Abbreviation) |
---|---|---|
U+000A
|
LINE FEED (LF) | <LF> |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
U+2028
|
LINE SEPARATOR | <LS> |
U+2029
|
PARAGRAPH SEPARATOR | <PS> |
只有
注释可以是单行或多行。多行注释不能嵌套。
由于单行注释可包含除 //
标记到该行末端的全部码点。然而,行末的
注释的行为类似空白并被丢弃;但若
本节若干产生式在
Hashbang 注释对位置敏感,并且与其它类型注释一样从句法语法的输入元素流中被丢弃。
本标准特别增加:U+0024 (DOLLAR SIGN) 与 U+005F (LOW LINE) 可在
非终结符
非终结符 _
。
具有 Unicode 属性 “ID_Start” 与 “ID_Continue” 的码点集合分别包含具有 “Other_ID_Start” 与 “Other_ID_Continue” 属性的码点。
\
不贡献码点。\
两个根据 Unicode 标准规范等价的
The syntax-directed operation
The syntax-directed operation
关键字 (keyword) 是匹配 if
、while
、async
、await
等。
保留字 (reserved word) 是不能用作标识符的 if
与 while
是保留字。await
仅在 async 函数与模块内部被保留。async
不是保留字;它可自由用作变量名或语句标签。
本规范结合语法产生式与await
与 yield
外的所有记号无条件被保留。await
与 yield
的例外通过带参数的句法产生式在
始终允许且不是关键字的,如 Math
、window
、toString
、_
;
永不允许的,即下表 await
、yield
);
上下文允许的,即 await
与 yield
;
在严格模式中上下文不允许的:let
、static
、implements
、interface
、package
、private
、protected
、public
;
始终允许但在某些句法产生式(as
、async
、from
、get
、meta
、of
、set
、target
。
条件关键字 (conditional keyword) 或 上下文关键字 (contextual keyword) 常用于指代后三类,它们在某些上下文可作标识符,在另一些上下文作关键字。
依据 \
\
els\u{65}
来声明名为 “else” 的变量。
enum
当前尚未作为关键字使用。它是一个未来保留字,为未来语言扩展保留。
同样地,implements
、interface
、package
、private
、protected
、public
在严格模式中是未来保留字。
例如:3in
是错误,而不是两个输入元素 3
与 in
。
数值字面量表示
The syntax-directed operation
字符串字面量是 0 个或更多 Unicode 码点,被单引号或双引号包围。Unicode 码点也可用转义序列表达。除闭合引号码点、U+005C (REVERSE SOLIDUS)、U+000D (CARRIAGE RETURN)、U+000A (LINE FEED) 外,所有码点都可直接出现在字符串字面量中。任何码点都可以转义形式出现。字符串字面量求值为 ECMAScript String 值。生成这些 String 值时 Unicode 码点按
非终结符
<LF> 与 <CR> 不能出现在字符串字面量中,除非作为 \n
或 \u000A
等转义序列。
字符串字面量可能位于使封闭代码进入
function invalid() { "\7"; "use strict"; }
The syntax-directed operation
字符串字面量表示
转义序列 (Escape Sequence) | 代码单元值 (Code Unit Value) | Unicode 字符名 (Unicode Character Name) | 符号 (Symbol) |
---|---|---|---|
\b
|
0x0008
|
BACKSPACE | <BS> |
\t
|
0x0009
|
CHARACTER TABULATION | <HT> |
\n
|
0x000A
|
LINE FEED (LF) | <LF> |
\v
|
0x000B
|
LINE TABULATION | <VT> |
\f
|
0x000C
|
FORM FEED (FF) | <FF> |
\r
|
0x000D
|
CARRIAGE RETURN (CR) | <CR> |
\"
|
0x0022
|
QUOTATION MARK |
"
|
\'
|
0x0027
|
APOSTROPHE |
'
|
\\
|
0x005C
|
REVERSE SOLIDUS |
\
|
下列产生式描述正则表达式字面量的语法,供输入元素扫描器定位字面量结束。由
实现可扩展
正则字面量不能为空;序列 //
表示单行注释而不是空正则。若需空正则,使用 /(?:)/
。
The syntax-directed operation
The syntax-directed operation
The syntax-directed operation
The syntax-directed operation
TV 不包含
大多数 ECMAScript 语句与声明必须以分号结束。此类分号可在源码中显式出现。为方便起见,在某些情形下可以省略;在这些情形中,认为分号被自动插入到源码记号流中。
下列规则中,“token” 指根据
分号插入有三条基本规则:
当从左到右解析源码时遇到一个不被任何语法产生式允许的记号(称为 违规记号 (offending token))时,如果满足以下任一条件,则在其前自动插入分号:
}
。
)
,且插入的分号会被解析为 do-while 语句(然而,上述规则受一个额外for
语句(见
以下是语法中唯一的受限产生式:
这些受限产生式的实际效果:
++
或 --
运算符的记号,且其与前一记号之间至少有一个 continue
、break
、return
、throw
或 yield
,且其后一个记号前存在 =>
前出现 =>
处语法错误。
async
后在期望的 function
、(
之前出现 async
归为同一表达式或类元素。
async
后在期望的 *
之前出现 对程序员的实践建议:
++
/ --
应与其操作数位于同一行。
return
、throw
语句中的 yield
表达式中的 break
、continue
语句中的 =>
应位于同一行。
async
应与紧随其后的记号在同一行。
源码
{ 1 2 } 3
即便考虑自动分号插入规则,也不是有效 ECMAScript 语句。相比之下,源码
{ 1
2 } 3
也不是有效语句,但会被自动分号插入转换为:
{ 1
;2 ;} 3;
其为有效语句。
源码
for (a; b
)
不是有效语句,且不会被修改,因为分号对 for
头部必要;自动分号插入不会插入 for
头部的两个分号之一。
源码
return
a + b
被转换为:
return;
a + b;
a + b
不作为 return
语句返回值,因为 return
分隔。
源码
a = b
++c
转换为:
a = b;
++c;
++
不作为应用于 b
的后缀运算符,因为 b
与 ++
之间存在
源码
if (a > b)
else c = d
不是有效语句,且在 else
前不会自动插入分号,即便此处没有适用的语法产生式,因为插入分号会形成空语句。
源码
a = b + c
(d + e).print()
不会 被转换,因为第二行以括号表达式开始可被解释为函数调用的实参列表:
a = b + c(d + e).print()
若赋值语句必须以左括号开始,建议在前一语句末尾显式写分号,而不是依赖自动分号插入。
ECMAScript 程序可以通过依赖自动分号插入以极少分号的风格编写。如前述,分号不会在每个换行处插入,并且插入可能依赖跨行的多个记号。
随着新语法特性的加入,可能增加新的产生式,使之前依赖自动分号插入的行在解析时改变其产生式。
本节中,若某处是否插入分号取决于其前源码,则视为“有趣”情形。剩余内容描述本版本 ECMAScript 中若干此类情形。
在
(
)。缺少分号会将两行合并为 [
)。缺少分号会解析为属性访问而非 `
)。缺少分号会合并为带前一个表达式为 +
或 -
。缺少分号会被解释为相应二元运算的一部分。/
ECMAScript 包含含 “[no
本节其余内容描述本版本中使用 “[no