1
2StringNumericLiteral :::
3  StrWhiteSpace?
4  StrWhiteSpace? StrNumericLiteral StrWhiteSpace?
5
6StrWhiteSpace :::
7  StrWhiteSpaceChar StrWhiteSpace?
8
9StrWhiteSpaceChar :::
10  WhiteSpace
11  LineTerminator
12
13StrNumericLiteral :::
14  StrDecimalLiteral
15  BinaryIntegerLiteral
16  OctalIntegerLiteral
17  HexIntegerLiteral
18
19StrDecimalLiteral :::
20  StrUnsignedDecimalLiteral
21  `+` StrUnsignedDecimalLiteral
22  `-` StrUnsignedDecimalLiteral
23
24StrUnsignedDecimalLiteral :::
25  `Infinity`
26  DecimalDigits `.` DecimalDigits? ExponentPart?
27  `.` DecimalDigits ExponentPart?
28  DecimalDigits ExponentPart?
29
30
31SourceCharacter ::
32  {}
33
34
35InputElementDiv ::
36  WhiteSpace
37  LineTerminator
38  Comment
39  CommonToken
40  DivPunctuator
41  RightBracePunctuator
42
43InputElementRegExp ::
44  WhiteSpace
45  LineTerminator
46  Comment
47  CommonToken
48  RightBracePunctuator
49  RegularExpressionLiteral
50
51InputElementRegExpOrTemplateTail ::
52  WhiteSpace
53  LineTerminator
54  Comment
55  CommonToken
56  RegularExpressionLiteral
57  TemplateSubstitutionTail
58
59InputElementTemplateTail ::
60  WhiteSpace
61  LineTerminator
62  Comment
63  CommonToken
64  DivPunctuator
65  TemplateSubstitutionTail
66
67
68WhiteSpace ::
69  <TAB>
70  <VT>
71  <FF>
72  <SP>
73  <NBSP>
74  <ZWNBSP>
75  {Zs}
76
77
78LineTerminator ::
79  <LF>
80  <CR>
81  <LINE SEPARATOR>
82  <PARAGRAPH SEPARATOR>
83
84LineTerminatorSequence ::
85  <LF>
86  <CR> [lookahead != <LF> ]
87  <LINE SEPARATOR>
88  <PARAGRAPH SEPARATOR>
89  <CR> <LF>
90
91
92Comment ::
93  MultiLineComment
94  SingleLineComment
95
96MultiLineComment ::
97  `/*` MultiLineCommentChars? `*/`
98
99MultiLineCommentChars ::
100  MultiLineNotAsteriskChar MultiLineCommentChars?
101  `*` PostAsteriskCommentChars?
102
103PostAsteriskCommentChars ::
104  MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentChars?
105  `*` PostAsteriskCommentChars?
106
107MultiLineNotAsteriskChar ::
108  SourceCharacter but not `*`
109
110MultiLineNotForwardSlashOrAsteriskChar ::
111  SourceCharacter but not one of `/` or `*`
112
113SingleLineComment ::
114  `//` SingleLineCommentChars?
115
116SingleLineCommentChars ::
117  SingleLineCommentChar SingleLineCommentChars?
118
119SingleLineCommentChar ::
120  SourceCharacter but not LineTerminator
121
122
123CommonToken ::
124  IdentifierName
125  Punctuator
126  NumericLiteral
127  StringLiteral
128  Template
129
130
131IdentifierName ::
132  IdentifierStart
133  IdentifierName IdentifierPart
134
135IdentifierStart ::
136  UnicodeIDStart
137  `$`
138  `_`
139  `\` UnicodeEscapeSequence
140
141IdentifierPart ::
142  UnicodeIDContinue
143  `$`
144  `\` UnicodeEscapeSequence
145  <ZWNJ>
146  <ZWJ>
147
148UnicodeIDStart ::
149  {L}
150  {NI}
151  U+2118
152  U+212E
153  U+309B
154  U+309C
155
156UnicodeIDContinue ::
157  UnicodeIDStart
158  {Mn}
159  {Mc}
160  {Nd}
161  {Pc}
162  U+1369
163  U+1370
164  U+1371
165  U+00B7
166  U+0387
167  U+19DA
168
169
170ReservedWord ::
171  Keyword
172  FutureReservedWord
173  NullLiteral
174  BooleanLiteral
175
176
177Keyword :: one of
178  `await`
179  `break`
180  `case` `catch` `class` `const` `continue`
181  `debugger` `default` `delete` `do`
182  `else` `export` `extends`
183  `finally` `for` `function`
184  `if` `import` `in` `instanceof`
185  `new`
186  `return`
187  `super` `switch`
188  `this` `throw` `try` `typeof`
189  `var` `void`
190  `while` `with`
191  `yield`
192
193
194FutureReservedWord ::
195  `enum`
196
197
198Punctuator :: one of
199  `{` `(` `)` `[` `]`
200  `.` `...` `;` `,`
201  `<` `>` `<=` `>=`
202  `==` `!=` `===` `!==`
203  `+` `-` `*` `%` `**`
204  `++` `--`
205  `<<` `>>` `>>>`
206  `&` `|` `^`
207  `!` `~`
208  `&&` `||`
209  `?` `:`
210  `=` `+=` `-=` `*=` `%=` `**=` `<<=` `>>=` `>>>=` `&=` `|=` `^=`
211  `=>`
212
213DivPunctuator ::
214  `/`
215  `/=`
216
217RightBracePunctuator ::
218  `}`
219
220
221NullLiteral ::
222  `null`
223
224
225BooleanLiteral ::
226  `true`
227  `false`
228
229
230NumericLiteral ::
231  DecimalLiteral
232  BinaryIntegerLiteral
233  OctalIntegerLiteral
234  HexIntegerLiteral
235
236DecimalLiteral ::
237  DecimalIntegerLiteral `.` DecimalDigits? ExponentPart?
238  `.` DecimalDigits ExponentPart?
239  DecimalIntegerLiteral ExponentPart?
240
241DecimalIntegerLiteral ::
242  `0`
243  NonZeroDigit DecimalDigits?
244
245DecimalDigits ::
246  DecimalDigit
247  DecimalDigits DecimalDigit
248
249DecimalDigit :: one of
250  `0` `1` `2` `3` `4` `5` `6` `7` `8` `9`
251
252NonZeroDigit :: one of
253  `1` `2` `3` `4` `5` `6` `7` `8` `9`
254
255ExponentPart ::
256  ExponentIndicator SignedInteger
257
258ExponentIndicator :: one of
259  `e` `E`
260
261SignedInteger ::
262  DecimalDigits
263  `+` DecimalDigits
264  `-` DecimalDigits
265
266BinaryIntegerLiteral ::
267  `0b` BinaryDigits
268  `0B` BinaryDigits
269
270BinaryDigits ::
271  BinaryDigit
272  BinaryDigits BinaryDigit
273
274BinaryDigit :: one of
275  `0` `1`
276
277OctalIntegerLiteral ::
278  `0o` OctalDigits
279  `0O` OctalDigits
280
281OctalDigits ::
282  OctalDigit
283  OctalDigits OctalDigit
284
285OctalDigit :: one of
286  `0` `1` `2` `3` `4` `5` `6` `7`
287
288HexIntegerLiteral ::
289  `0x` HexDigits
290  `0X` HexDigits
291
292HexDigits ::
293  HexDigit
294  HexDigits HexDigit
295
296HexDigit :: one of
297  `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` `a` `b` `c` `d` `e` `f` `A` `B` `C` `D` `E` `F`
298
299
300StringLiteral ::
301  `"` DoubleStringCharacters? `"`
302  `'` SingleStringCharacters? `'`
303
304DoubleStringCharacters ::
305  DoubleStringCharacter DoubleStringCharacters?
306
307SingleStringCharacters ::
308  SingleStringCharacter SingleStringCharacters?
309
310DoubleStringCharacter ::
311  SourceCharacter but not one of `"` or `\` or LineTerminator
312  <LINE SEPARATOR>
313  <PARAGRAPH SEPARATOR>
314  `\` EscapeSequence
315  LineContinuation
316
317SingleStringCharacter ::
318  SourceCharacter but not one of `'` or `\` or LineTerminator
319  <LINE SEPARATOR>
320  <PARAGRAPH SEPARATOR>
321  `\` EscapeSequence
322  LineContinuation
323
324LineContinuation ::
325  `\` LineTerminatorSequence
326
327EscapeSequence ::
328  CharacterEscapeSequence
329  `0` [lookahead <! DecimalDigit]
330  HexEscapeSequence
331  UnicodeEscapeSequence
332
333
334CharacterEscapeSequence ::
335  SingleEscapeCharacter
336  NonEscapeCharacter
337
338SingleEscapeCharacter :: one of
339  `'` `"` `\` `b` `f` `n` `r` `t` `v`
340
341NonEscapeCharacter ::
342  SourceCharacter but not one of EscapeCharacter or LineTerminator
343
344EscapeCharacter ::
345  SingleEscapeCharacter
346  DecimalDigit
347  `x`
348  `u`
349
350HexEscapeSequence ::
351  `x` HexDigit HexDigit
352
353UnicodeEscapeSequence ::
354  `u` Hex4Digits
355  `u{` CodePoint `}`
356
357Hex4Digits ::
358  HexDigit HexDigit HexDigit HexDigit
359
360
361RegularExpressionLiteral ::
362  `/` RegularExpressionBody `/` RegularExpressionFlags
363
364RegularExpressionBody ::
365  RegularExpressionFirstChar RegularExpressionChars
366
367RegularExpressionChars ::
368  [empty]
369  RegularExpressionChars RegularExpressionChar
370
371RegularExpressionFirstChar ::
372  RegularExpressionNonTerminator but not one of `*` or `\` or `/` or `[`
373  RegularExpressionBackslashSequence
374  RegularExpressionClass
375
376RegularExpressionChar ::
377  RegularExpressionNonTerminator but not one of `\` or `/` or `[`
378  RegularExpressionBackslashSequence
379  RegularExpressionClass
380
381RegularExpressionBackslashSequence ::
382  `\` RegularExpressionNonTerminator
383
384RegularExpressionNonTerminator ::
385  SourceCharacter but not LineTerminator
386
387RegularExpressionClass ::
388  `[` RegularExpressionClassChars `]`
389
390RegularExpressionClassChars ::
391  [empty]
392  RegularExpressionClassChars RegularExpressionClassChar
393
394RegularExpressionClassChar ::
395  RegularExpressionNonTerminator but not one of `]` or `\`
396  RegularExpressionBackslashSequence
397
398RegularExpressionFlags ::
399  [empty]
400  RegularExpressionFlags IdentifierPart
401
402
403Template ::
404  NoSubstitutionTemplate
405  TemplateHead
406
407NoSubstitutionTemplate ::
408  ``` TemplateCharacters? ```
409
410TemplateHead ::
411  ``` TemplateCharacters? `${`
412
413TemplateSubstitutionTail ::
414  TemplateMiddle
415  TemplateTail
416
417TemplateMiddle ::
418  `}` TemplateCharacters? `${`
419
420TemplateTail ::
421  `}` TemplateCharacters? ```
422
423TemplateCharacters ::
424  TemplateCharacter TemplateCharacters?
425
426TemplateCharacter ::
427  `$` [lookahead != `{` ]
428  `\` EscapeSequence
429  `\` NotEscapeSequence
430  LineContinuation
431  LineTerminatorSequence
432  SourceCharacter but not one of ``` or `\` or `$` or LineTerminator
433
434NotEscapeSequence ::
435  `0` DecimalDigit
436  DecimalDigit but not `0`
437  `x` [lookahead <! HexDigit]
438  `x` HexDigit [lookahead <! HexDigit]
439  `u` [lookahead <! HexDigit] [lookahead != `{`]
440  `u` HexDigit [lookahead <! HexDigit]
441  `u` HexDigit HexDigit [lookahead <! HexDigit]
442  `u` HexDigit HexDigit HexDigit [lookahead <! HexDigit]
443  `u` `{` [lookahead <! HexDigit]
444  `u` `{` NotCodePoint [lookahead <! HexDigit]
445  `u` `{` CodePoint [lookahead <! HexDigit] [lookahead != `}`]
446
447NotCodePoint ::
448  HexDigits [> but only if MV of |HexDigits| > 0x10FFFF ]
449
450CodePoint ::
451  HexDigits [> but only if MV of |HexDigits| ≤ 0x10FFFF ]
452
453
454IdentifierReference[Yield, Await] :
455  Identifier
456  [~Yield] `yield`
457  [~Await] `await`
458
459BindingIdentifier[Yield, Await] :
460  Identifier
461  `yield`
462  `await`
463
464LabelIdentifier[Yield, Await] :
465  Identifier
466  [~Yield] `yield`
467  [~Await] `await`
468
469Identifier :
470  IdentifierName but not ReservedWord
471
472
473PrimaryExpression[Yield, Await] :
474  `this`
475  IdentifierReference[?Yield, ?Await]
476  Literal
477  ArrayLiteral[?Yield, ?Await]
478  ObjectLiteral[?Yield, ?Await]
479  FunctionExpression
480  ClassExpression[?Yield, ?Await]
481  GeneratorExpression
482  AsyncFunctionExpression
483  AsyncGeneratorExpression
484  RegularExpressionLiteral
485  TemplateLiteral[?Yield, ?Await, ~Tagged]
486  CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] #parencover
487
488CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] :
489  `(` Expression[+In, ?Yield, ?Await] `)`
490  `(` Expression[+In, ?Yield, ?Await] `,` `)`
491  `(` `)`
492  `(` `...` BindingIdentifier[?Yield, ?Await] `)`
493  `(` `...` BindingPattern[?Yield, ?Await] `)`
494  `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingIdentifier[?Yield, ?Await] `)`
495  `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingPattern[?Yield, ?Await] `)`
496
497
498ParenthesizedExpression[Yield, Await] :
499  `(` Expression[+In, ?Yield, ?Await] `)`
500
501
502Literal :
503  NullLiteral
504  BooleanLiteral
505  NumericLiteral
506  StringLiteral
507
508
509ArrayLiteral[Yield, Await] :
510  `[` Elision? `]`
511  `[` ElementList[?Yield, ?Await] `]`
512  `[` ElementList[?Yield, ?Await] `,` Elision? `]`
513
514ElementList[Yield, Await] :
515  Elision? AssignmentExpression[+In, ?Yield, ?Await]
516  Elision? SpreadElement[?Yield, ?Await]
517  ElementList[?Yield, ?Await] `,` Elision? AssignmentExpression[+In, ?Yield, ?Await]
518  ElementList[?Yield, ?Await] `,` Elision? SpreadElement[?Yield, ?Await]
519
520Elision :
521  `,`
522  Elision `,`
523
524SpreadElement[Yield, Await] :
525  `...` AssignmentExpression[+In, ?Yield, ?Await]
526
527
528ObjectLiteral[Yield, Await] :
529  `{` `}`
530  `{` PropertyDefinitionList[?Yield, ?Await] `}`
531  `{` PropertyDefinitionList[?Yield, ?Await] `,` `}`
532
533PropertyDefinitionList[Yield, Await] :
534  PropertyDefinition[?Yield, ?Await]
535  PropertyDefinitionList[?Yield, ?Await] `,` PropertyDefinition[?Yield, ?Await]
536
537PropertyDefinition[Yield, Await] :
538  IdentifierReference[?Yield, ?Await]
539  CoverInitializedName[?Yield, ?Await]
540  PropertyName[?Yield, ?Await] `:` AssignmentExpression[+In, ?Yield, ?Await]
541  MethodDefinition[?Yield, ?Await]
542  `...` AssignmentExpression[+In, ?Yield, ?Await]
543
544PropertyName[Yield, Await] :
545  LiteralPropertyName
546  ComputedPropertyName[?Yield, ?Await]
547
548LiteralPropertyName :
549  IdentifierName
550  StringLiteral
551  NumericLiteral
552
553ComputedPropertyName[Yield, Await] :
554  `[` AssignmentExpression[+In, ?Yield, ?Await] `]`
555
556CoverInitializedName[Yield, Await] :
557  IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
558
559Initializer[In, Yield, Await] :
560  `=` AssignmentExpression[?In, ?Yield, ?Await]
561
562
563TemplateLiteral[Yield, Await, Tagged] :
564  NoSubstitutionTemplate
565  SubstitutionTemplate[?Yield, ?Await, ?Tagged]
566
567SubstitutionTemplate[Yield, Await, Tagged] :
568  TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
569
570TemplateSpans[Yield, Await, Tagged] :
571  TemplateTail
572  TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail
573
574TemplateMiddleList[Yield, Await, Tagged] :
575  TemplateMiddle Expression[+In, ?Yield, ?Await]
576  TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]
577
578
579MemberExpression[Yield, Await] :
580  PrimaryExpression[?Yield, ?Await]
581  MemberExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
582  MemberExpression[?Yield, ?Await] `.` IdentifierName
583  MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
584  SuperProperty[?Yield, ?Await]
585  MetaProperty
586  `new` MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
587
588SuperProperty[Yield, Await] :
589  `super` `[` Expression[+In, ?Yield, ?Await] `]`
590  `super` `.` IdentifierName
591
592MetaProperty :
593  NewTarget
594
595NewTarget :
596  `new` `.` `target`
597
598NewExpression[Yield, Await] :
599  MemberExpression[?Yield, ?Await]
600  `new` NewExpression[?Yield, ?Await]
601
602CallExpression[Yield, Await] :
603  CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] #callcover
604  SuperCall[?Yield, ?Await]
605  ImportCall[?Yield, ?Await]
606  CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
607  CallExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
608  CallExpression[?Yield, ?Await] `.` IdentifierName
609  CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
610
611SuperCall[Yield, Await] :
612  `super` Arguments[?Yield, ?Await]
613
614ImportCall[Yield, Await] :
615  `import` `(` AssignmentExpression[+In, ?Yield, ?Await] `)`
616
617Arguments[Yield, Await] :
618  `(` `)`
619  `(` ArgumentList[?Yield, ?Await] `)`
620  `(` ArgumentList[?Yield, ?Await] `,` `)`
621
622ArgumentList[Yield, Await] :
623  AssignmentExpression[+In, ?Yield, ?Await]
624  `...` AssignmentExpression[+In, ?Yield, ?Await]
625  ArgumentList[?Yield, ?Await] `,` AssignmentExpression[+In, ?Yield, ?Await]
626  ArgumentList[?Yield, ?Await] `,` `...` AssignmentExpression[+In, ?Yield, ?Await]
627
628LeftHandSideExpression[Yield, Await] :
629  NewExpression[?Yield, ?Await]
630  CallExpression[?Yield, ?Await]
631
632
633CallMemberExpression[Yield, Await] :
634  MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
635
636
637UpdateExpression[Yield, Await] :
638  LeftHandSideExpression[?Yield, ?Await]
639  LeftHandSideExpression[?Yield, ?Await] `++`
640  LeftHandSideExpression[?Yield, ?Await] `--`
641  `++` UnaryExpression[?Yield, ?Await]
642  `--` UnaryExpression[?Yield, ?Await]
643
644
645UnaryExpression[Yield, Await] :
646  UpdateExpression[?Yield, ?Await]
647  `delete` UnaryExpression[?Yield, ?Await]
648  `void` UnaryExpression[?Yield, ?Await]
649  `typeof` UnaryExpression[?Yield, ?Await]
650  `+` UnaryExpression[?Yield, ?Await]
651  `-` UnaryExpression[?Yield, ?Await]
652  `~` UnaryExpression[?Yield, ?Await]
653  `!` UnaryExpression[?Yield, ?Await]
654  [+Await] AwaitExpression[?Yield]
655
656
657ExponentiationExpression[Yield, Await] :
658  UnaryExpression[?Yield, ?Await]
659  UpdateExpression[?Yield, ?Await] `**` ExponentiationExpression[?Yield, ?Await]
660
661
662MultiplicativeExpression[Yield, Await] :
663  ExponentiationExpression[?Yield, ?Await]
664  MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await]
665
666MultiplicativeOperator : one of
667  `*` `/` `%`
668
669
670AdditiveExpression[Yield, Await] :
671  MultiplicativeExpression[?Yield, ?Await]
672  AdditiveExpression[?Yield, ?Await] `+` MultiplicativeExpression[?Yield, ?Await]
673  AdditiveExpression[?Yield, ?Await] `-` MultiplicativeExpression[?Yield, ?Await]
674
675
676ShiftExpression[Yield, Await] :
677  AdditiveExpression[?Yield, ?Await]
678  ShiftExpression[?Yield, ?Await] `<<` AdditiveExpression[?Yield, ?Await]
679  ShiftExpression[?Yield, ?Await] `>>` AdditiveExpression[?Yield, ?Await]
680  ShiftExpression[?Yield, ?Await] `>>>` AdditiveExpression[?Yield, ?Await]
681
682
683RelationalExpression[In, Yield, Await] :
684  ShiftExpression[?Yield, ?Await]
685  RelationalExpression[?In, ?Yield, ?Await] `<` ShiftExpression[?Yield, ?Await]
686  RelationalExpression[?In, ?Yield, ?Await] `>` ShiftExpression[?Yield, ?Await]
687  RelationalExpression[?In, ?Yield, ?Await] `<=` ShiftExpression[?Yield, ?Await]
688  RelationalExpression[?In, ?Yield, ?Await] `>=` ShiftExpression[?Yield, ?Await]
689  RelationalExpression[?In, ?Yield, ?Await] `instanceof` ShiftExpression[?Yield, ?Await]
690  [+In] RelationalExpression[+In, ?Yield, ?Await] `in` ShiftExpression[?Yield, ?Await]
691
692
693EqualityExpression[In, Yield, Await] :
694  RelationalExpression[?In, ?Yield, ?Await]
695  EqualityExpression[?In, ?Yield, ?Await] `==` RelationalExpression[?In, ?Yield, ?Await]
696  EqualityExpression[?In, ?Yield, ?Await] `!=` RelationalExpression[?In, ?Yield, ?Await]
697  EqualityExpression[?In, ?Yield, ?Await] `===` RelationalExpression[?In, ?Yield, ?Await]
698  EqualityExpression[?In, ?Yield, ?Await] `!==` RelationalExpression[?In, ?Yield, ?Await]
699
700
701BitwiseANDExpression[In, Yield, Await] :
702  EqualityExpression[?In, ?Yield, ?Await]
703  BitwiseANDExpression[?In, ?Yield, ?Await] `&` EqualityExpression[?In, ?Yield, ?Await]
704
705BitwiseXORExpression[In, Yield, Await] :
706  BitwiseANDExpression[?In, ?Yield, ?Await]
707  BitwiseXORExpression[?In, ?Yield, ?Await] `^` BitwiseANDExpression[?In, ?Yield, ?Await]
708
709BitwiseORExpression[In, Yield, Await] :
710  BitwiseXORExpression[?In, ?Yield, ?Await]
711  BitwiseORExpression[?In, ?Yield, ?Await] `|` BitwiseXORExpression[?In, ?Yield, ?Await]
712
713
714LogicalANDExpression[In, Yield, Await] :
715  BitwiseORExpression[?In, ?Yield, ?Await]
716  LogicalANDExpression[?In, ?Yield, ?Await] `&&` BitwiseORExpression[?In, ?Yield, ?Await]
717
718LogicalORExpression[In, Yield, Await] :
719  LogicalANDExpression[?In, ?Yield, ?Await]
720  LogicalORExpression[?In, ?Yield, ?Await] `||` LogicalANDExpression[?In, ?Yield, ?Await]
721
722
723ConditionalExpression[In, Yield, Await] :
724  LogicalORExpression[?In, ?Yield, ?Await]
725  LogicalORExpression[?In, ?Yield, ?Await] `?` AssignmentExpression[+In, ?Yield, ?Await] `:` AssignmentExpression[?In, ?Yield, ?Await]
726
727
728AssignmentExpression[In, Yield, Await] :
729  ConditionalExpression[?In, ?Yield, ?Await]
730  [+Yield] YieldExpression[?In, ?Await]
731  ArrowFunction[?In, ?Yield, ?Await]
732  AsyncArrowFunction[?In, ?Yield, ?Await]
733  LeftHandSideExpression[?Yield, ?Await] `=` AssignmentExpression[?In, ?Yield, ?Await] #assignment
734  LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await]
735
736AssignmentOperator : one of
737  `*=` `/=` `%=` `+=` `-=` `<<=` `>>=` `>>>=` `&=` `^=` `|=` `**=`
738
739
740AssignmentPattern[Yield, Await] :
741  ObjectAssignmentPattern[?Yield, ?Await]
742  ArrayAssignmentPattern[?Yield, ?Await]
743
744ObjectAssignmentPattern[Yield, Await] :
745  `{` `}`
746  `{` AssignmentRestProperty[?Yield, ?Await] `}`
747  `{` AssignmentPropertyList[?Yield, ?Await] `}`
748  `{` AssignmentPropertyList[?Yield, ?Await] `,` AssignmentRestProperty[?Yield, ?Await]? `}`
749
750ArrayAssignmentPattern[Yield, Await] :
751  `[` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
752  `[` AssignmentElementList[?Yield, ?Await] `]`
753  `[` AssignmentElementList[?Yield, ?Await] `,` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
754
755AssignmentRestProperty[Yield, Await] :
756  `...` DestructuringAssignmentTarget[?Yield, ?Await]
757
758AssignmentPropertyList[Yield, Await] :
759  AssignmentProperty[?Yield, ?Await]
760  AssignmentPropertyList[?Yield, ?Await] `,` AssignmentProperty[?Yield, ?Await]
761
762AssignmentElementList[Yield, Await] :
763  AssignmentElisionElement[?Yield, ?Await]
764  AssignmentElementList[?Yield, ?Await] `,` AssignmentElisionElement[?Yield, ?Await]
765
766AssignmentElisionElement[Yield, Await] :
767  Elision? AssignmentElement[?Yield, ?Await]
768
769AssignmentProperty[Yield, Await] :
770  IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
771  PropertyName[?Yield, ?Await] `:` AssignmentElement[?Yield, ?Await]
772
773AssignmentElement[Yield, Await] :
774  DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
775
776AssignmentRestElement[Yield, Await] :
777  `...` DestructuringAssignmentTarget[?Yield, ?Await]
778
779DestructuringAssignmentTarget[Yield, Await] :
780  LeftHandSideExpression[?Yield, ?Await]
781
782
783Expression[In, Yield, Await] :
784  AssignmentExpression[?In, ?Yield, ?Await]
785  Expression[?In, ?Yield, ?Await] `,` AssignmentExpression[?In, ?Yield, ?Await]
786
787
788Statement[Yield, Await, Return] :
789  BlockStatement[?Yield, ?Await, ?Return]
790  VariableStatement[?Yield, ?Await]
791  EmptyStatement
792  ExpressionStatement[?Yield, ?Await]
793  IfStatement[?Yield, ?Await, ?Return]
794  BreakableStatement[?Yield, ?Await, ?Return]
795  ContinueStatement[?Yield, ?Await]
796  BreakStatement[?Yield, ?Await]
797  [+Return] ReturnStatement[?Yield, ?Await]
798  WithStatement[?Yield, ?Await, ?Return]
799  LabelledStatement[?Yield, ?Await, ?Return]
800  ThrowStatement[?Yield, ?Await]
801  TryStatement[?Yield, ?Await, ?Return]
802  DebuggerStatement
803
804Declaration[Yield, Await] :
805  HoistableDeclaration[?Yield, ?Await, ~Default]
806  ClassDeclaration[?Yield, ?Await, ~Default]
807  LexicalDeclaration[+In, ?Yield, ?Await]
808
809HoistableDeclaration[Yield, Await, Default] :
810  FunctionDeclaration[?Yield, ?Await, ?Default]
811  GeneratorDeclaration[?Yield, ?Await, ?Default]
812  AsyncFunctionDeclaration[?Yield, ?Await, ?Default]
813  AsyncGeneratorDeclaration[?Yield, ?Await, ?Default]
814
815BreakableStatement[Yield, Await, Return] :
816  IterationStatement[?Yield, ?Await, ?Return]
817  SwitchStatement[?Yield, ?Await, ?Return]
818
819
820BlockStatement[Yield, Await, Return] :
821  Block[?Yield, ?Await, ?Return]
822
823Block[Yield, Await, Return] :
824  `{` StatementList[?Yield, ?Await, ?Return]? `}`
825
826StatementList[Yield, Await, Return] :
827  StatementListItem[?Yield, ?Await, ?Return]
828  StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return]
829
830StatementListItem[Yield, Await, Return] :
831  Statement[?Yield, ?Await, ?Return]
832  Declaration[?Yield, ?Await]
833
834
835LexicalDeclaration[In, Yield, Await] :
836  LetOrConst BindingList[?In, ?Yield, ?Await] `;`
837
838LetOrConst :
839  `let`
840  `const`
841
842BindingList[In, Yield, Await] :
843  LexicalBinding[?In, ?Yield, ?Await]
844  BindingList[?In, ?Yield, ?Await] `,` LexicalBinding[?In, ?Yield, ?Await]
845
846LexicalBinding[In, Yield, Await] :
847  BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]?
848  BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
849
850
851VariableStatement[Yield, Await] :
852  `var` VariableDeclarationList[+In, ?Yield, ?Await] `;`
853
854VariableDeclarationList[In, Yield, Await] :
855  VariableDeclaration[?In, ?Yield, ?Await]
856  VariableDeclarationList[?In, ?Yield, ?Await] `,` VariableDeclaration[?In, ?Yield, ?Await]
857
858VariableDeclaration[In, Yield, Await] :
859  BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]?
860  BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
861
862
863BindingPattern[Yield, Await] :
864  ObjectBindingPattern[?Yield, ?Await]
865  ArrayBindingPattern[?Yield, ?Await]
866
867ObjectBindingPattern[Yield, Await] :
868  `{` `}`
869  `{` BindingRestProperty[?Yield, ?Await] `}`
870  `{` BindingPropertyList[?Yield, ?Await] `}`
871  `{` BindingPropertyList[?Yield, ?Await] `,` BindingRestProperty[?Yield, ?Await]? `}`
872
873ArrayBindingPattern[Yield, Await] :
874  `[` Elision? BindingRestElement[?Yield, ?Await]? `]`
875  `[` BindingElementList[?Yield, ?Await] `]`
876  `[` BindingElementList[?Yield, ?Await] `,` Elision? BindingRestElement[?Yield, ?Await]? `]`
877
878BindingRestProperty[Yield, Await] :
879  `...` BindingIdentifier[?Yield, ?Await]
880
881BindingPropertyList[Yield, Await] :
882  BindingProperty[?Yield, ?Await]
883  BindingPropertyList[?Yield, ?Await] `,` BindingProperty[?Yield, ?Await]
884
885BindingElementList[Yield, Await] :
886  BindingElisionElement[?Yield, ?Await]
887  BindingElementList[?Yield, ?Await] `,` BindingElisionElement[?Yield, ?Await]
888
889BindingElisionElement[Yield, Await] :
890  Elision? BindingElement[?Yield, ?Await]
891
892BindingProperty[Yield, Await] :
893  SingleNameBinding[?Yield, ?Await]
894  PropertyName[?Yield, ?Await] `:` BindingElement[?Yield, ?Await]
895
896BindingElement[Yield, Await] :
897  SingleNameBinding[?Yield, ?Await]
898  BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
899
900SingleNameBinding[Yield, Await] :
901  BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
902
903BindingRestElement[Yield, Await] :
904  `...` BindingIdentifier[?Yield, ?Await]
905  `...` BindingPattern[?Yield, ?Await]
906
907
908EmptyStatement :
909  `;`
910
911
912ExpressionStatement[Yield, Await] :
913  [lookahead <! {`{`, `function`, `async`, `class`, `let`}] Expression[+In, ?Yield, ?Await] `;`
914
915
916IfStatement[Yield, Await, Return] :
917  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` Statement[?Yield, ?Await, ?Return]
918  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
919
920
921IterationStatement[Yield, Await, Return] :
922  `do` Statement[?Yield, ?Await, ?Return] `while` `(` Expression[+In, ?Yield, ?Await] `)` `;`
923  `while` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
924  `for` `(` [lookahead != `let`] Expression[~In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
925  `for` `(` `var` VariableDeclarationList[~In, ?Yield, ?Await] `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
926  `for` `(` ForLexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
927  `for` `(` [lookahead != `let`] LeftHandSideExpression[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
928  `for` `(` `var` ForBinding[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
929  `for` `(` ForDeclaration[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
930  `for` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
931  `for` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
932  `for` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
933  [+Await] `for` `await` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
934  [+Await] `for` `await` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
935  [+Await] `for` `await` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
936
937ForDeclaration[Yield, Await] :
938  LetOrConst ForBinding[?Yield, ?Await]
939
940ForBinding[Yield, Await] :
941  BindingIdentifier[?Yield, ?Await]
942  BindingPattern[?Yield, ?Await]
943
944
945ContinueStatement[Yield, Await] :
946  `continue` `;`
947  `continue` LabelIdentifier[?Yield, ?Await] `;`
948
949
950BreakStatement[Yield, Await] :
951  `break` `;`
952  `break` LabelIdentifier[?Yield, ?Await] `;`
953
954
955ReturnStatement[Yield, Await] :
956  `return` `;`
957  `return` Expression[+In, ?Yield, ?Await] `;`
958
959
960WithStatement[Yield, Await, Return] :
961  `with` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
962
963
964SwitchStatement[Yield, Await, Return] :
965  `switch` `(` Expression[+In, ?Yield, ?Await] `)` CaseBlock[?Yield, ?Await, ?Return]
966
967CaseBlock[Yield, Await, Return] :
968  `{` CaseClauses[?Yield, ?Await, ?Return]? `}`
969  `{` CaseClauses[?Yield, ?Await, ?Return]? DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]? `}`
970
971CaseClauses[Yield, Await, Return] :
972  CaseClause[?Yield, ?Await, ?Return]
973  CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return]
974
975CaseClause[Yield, Await, Return] :
976  `case` Expression[+In, ?Yield, ?Await] `:` StatementList[?Yield, ?Await, ?Return]?
977
978DefaultClause[Yield, Await, Return] :
979  `default` `:` StatementList[?Yield, ?Await, ?Return]?
980
981
982LabelledStatement[Yield, Await, Return] :
983  LabelIdentifier[?Yield, ?Await] `:` LabelledItem[?Yield, ?Await, ?Return]
984
985LabelledItem[Yield, Await, Return] :
986  Statement[?Yield, ?Await, ?Return]
987  FunctionDeclaration[?Yield, ?Await, ~Default]
988
989
990ThrowStatement[Yield, Await] :
991  `throw` Expression[+In, ?Yield, ?Await] `;`
992
993
994TryStatement[Yield, Await, Return] :
995  `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return]
996  `try` Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
997  `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
998
999Catch[Yield, Await, Return] :
1000  `catch` `(` CatchParameter[?Yield, ?Await] `)` Block[?Yield, ?Await, ?Return]
1001  `catch` Block[?Yield, ?Await, ?Return]
1002
1003Finally[Yield, Await, Return] :
1004  `finally` Block[?Yield, ?Await, ?Return]
1005
1006CatchParameter[Yield, Await] :
1007  BindingIdentifier[?Yield, ?Await]
1008  BindingPattern[?Yield, ?Await]
1009
1010
1011DebuggerStatement :
1012  `debugger` `;`
1013
1014
1015FunctionDeclaration[Yield, Await, Default] :
1016  `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1017  [+Default] `function` `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1018
1019FunctionExpression :
1020  `function` BindingIdentifier[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1021
1022UniqueFormalParameters[Yield, Await] :
1023  FormalParameters[?Yield, ?Await]
1024
1025FormalParameters[Yield, Await] :
1026  [empty]
1027  FunctionRestParameter[?Yield, ?Await]
1028  FormalParameterList[?Yield, ?Await]
1029  FormalParameterList[?Yield, ?Await] `,`
1030  FormalParameterList[?Yield, ?Await] `,` FunctionRestParameter[?Yield, ?Await]
1031
1032FormalParameterList[Yield, Await] :
1033  FormalParameter[?Yield, ?Await]
1034  FormalParameterList[?Yield, ?Await] `,` FormalParameter[?Yield, ?Await]
1035
1036FunctionRestParameter[Yield, Await] :
1037  BindingRestElement[?Yield, ?Await]
1038
1039FormalParameter[Yield, Await] :
1040  BindingElement[?Yield, ?Await]
1041
1042FunctionBody[Yield, Await] :
1043  FunctionStatementList[?Yield, ?Await]
1044
1045FunctionStatementList[Yield, Await] :
1046  StatementList[?Yield, ?Await, +Return]?
1047
1048
1049ArrowFunction[In, Yield, Await] :
1050  ArrowParameters[?Yield, ?Await] `=>` ConciseBody[?In]
1051
1052ArrowParameters[Yield, Await] :
1053  BindingIdentifier[?Yield, ?Await]
1054  CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] #parencover
1055
1056ConciseBody[In] :
1057  [lookahead != `{` ] AssignmentExpression[?In, ~Yield, ~Await]
1058  `{` FunctionBody[~Yield, ~Await] `}`
1059
1060
1061ArrowFormalParameters[Yield, Await] :
1062  `(` UniqueFormalParameters[?Yield, ?Await] `)`
1063
1064
1065MethodDefinition[Yield, Await] :
1066  PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1067  GeneratorMethod[?Yield, ?Await]
1068  AsyncMethod[?Yield, ?Await]
1069  AsyncGeneratorMethod[?Yield, ?Await]
1070  `get` PropertyName[?Yield, ?Await] `(` `)` `{` FunctionBody[~Yield, ~Await] `}`
1071  `set` PropertyName[?Yield, ?Await] `(` PropertySetParameterList `)` `{` FunctionBody[~Yield, ~Await] `}`
1072
1073PropertySetParameterList :
1074  FormalParameter[~Yield, ~Await]
1075
1076
1077GeneratorMethod[Yield, Await] :
1078  `*` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1079
1080GeneratorDeclaration[Yield, Await, Default] :
1081  `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1082  [+Default] `function` `*` `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1083
1084GeneratorExpression :
1085  `function` `*` BindingIdentifier[+Yield, ~Await]? `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1086
1087GeneratorBody :
1088  FunctionBody[+Yield, ~Await]
1089
1090YieldExpression[In, Await] :
1091  `yield`
1092  `yield` AssignmentExpression[?In, +Yield, ?Await]
1093  `yield` `*` AssignmentExpression[?In, +Yield, ?Await]
1094
1095
1096AsyncGeneratorMethod[Yield, Await] :
1097  `async` `*` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1098
1099AsyncGeneratorDeclaration[Yield, Await, Default] :
1100  `async` `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1101  [+Default] `async` `function` `*` `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1102
1103AsyncGeneratorExpression :
1104  `async` `function` `*` BindingIdentifier[+Yield, +Await]? `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1105
1106AsyncGeneratorBody :
1107  FunctionBody[+Yield, +Await]
1108
1109
1110ClassDeclaration[Yield, Await, Default] :
1111  `class` BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
1112  [+Default] `class` ClassTail[?Yield, ?Await]
1113
1114ClassExpression[Yield, Await] :
1115  `class` BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await]
1116
1117ClassTail[Yield, Await] :
1118  ClassHeritage[?Yield, ?Await]? `{` ClassBody[?Yield, ?Await]? `}`
1119
1120ClassHeritage[Yield, Await] :
1121  `extends` LeftHandSideExpression[?Yield, ?Await]
1122
1123ClassBody[Yield, Await] :
1124  ClassElementList[?Yield, ?Await]
1125
1126ClassElementList[Yield, Await] :
1127  ClassElement[?Yield, ?Await]
1128  ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await]
1129
1130ClassElement[Yield, Await] :
1131  MethodDefinition[?Yield, ?Await]
1132  `static` MethodDefinition[?Yield, ?Await]
1133  `;`
1134
1135
1136AsyncFunctionDeclaration[Yield, Await, Default] :
1137  `async` `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1138  [+Default] `async` `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1139
1140AsyncFunctionExpression :
1141  `async` `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1142  `async` `function` BindingIdentifier[~Yield, +Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1143
1144AsyncMethod[Yield, Await] :
1145  `async` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1146
1147AsyncFunctionBody :
1148  FunctionBody[~Yield, +Await]
1149
1150AwaitExpression[Yield] :
1151  `await` UnaryExpression[?Yield, +Await]
1152
1153
1154AsyncArrowFunction[In, Yield, Await] :
1155  `async` AsyncArrowBindingIdentifier[?Yield] `=>` AsyncConciseBody[?In]
1156  CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] `=>` AsyncConciseBody[?In] #callcover
1157
1158AsyncConciseBody[In] :
1159  [lookahead != `{`] AssignmentExpression[?In, ~Yield, +Await]
1160  `{` AsyncFunctionBody `}`
1161
1162AsyncArrowBindingIdentifier[Yield] :
1163  BindingIdentifier[?Yield, +Await]
1164
1165CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
1166  MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
1167
1168
1169AsyncArrowHead :
1170  `async` ArrowFormalParameters[~Yield, +Await]
1171
1172
1173Script :
1174  ScriptBody?
1175
1176ScriptBody :
1177  StatementList[~Yield, ~Await, ~Return]
1178
1179
1180Module :
1181  ModuleBody?
1182
1183ModuleBody :
1184  ModuleItemList
1185
1186ModuleItemList :
1187  ModuleItem
1188  ModuleItemList ModuleItem
1189
1190ModuleItem :
1191  ImportDeclaration
1192  ExportDeclaration
1193  StatementListItem[~Yield, ~Await, ~Return]
1194
1195
1196ImportDeclaration :
1197  `import` ImportClause FromClause `;`
1198  `import` ModuleSpecifier `;`
1199
1200ImportClause :
1201  ImportedDefaultBinding
1202  NameSpaceImport
1203  NamedImports
1204  ImportedDefaultBinding `,` NameSpaceImport
1205  ImportedDefaultBinding `,` NamedImports
1206
1207ImportedDefaultBinding :
1208  ImportedBinding
1209
1210NameSpaceImport :
1211  `*` `as` ImportedBinding
1212
1213NamedImports :
1214  `{` `}`
1215  `{` ImportsList `}`
1216  `{` ImportsList `,` `}`
1217
1218FromClause :
1219  `from` ModuleSpecifier
1220
1221ImportsList :
1222  ImportSpecifier
1223  ImportsList `,` ImportSpecifier
1224
1225ImportSpecifier :
1226  ImportedBinding
1227  IdentifierName `as` ImportedBinding
1228
1229ModuleSpecifier :
1230  StringLiteral
1231
1232ImportedBinding :
1233  BindingIdentifier[~Yield, ~Await]
1234
1235
1236ExportDeclaration :
1237  `export` `*` FromClause `;`
1238  `export` ExportClause FromClause `;`
1239  `export` ExportClause `;`
1240  `export` VariableStatement[~Yield, ~Await]
1241  `export` Declaration[~Yield, ~Await]
1242  `export` `default` HoistableDeclaration[~Yield, ~Await, +Default]
1243  `export` `default` ClassDeclaration[~Yield, ~Await, +Default]
1244  `export` `default` [lookahead <! {`function`, `async`, `class`}] AssignmentExpression[+In, ~Yield, ~Await] `;`
1245
1246ExportClause :
1247  `{` `}`
1248  `{` ExportsList `}`
1249  `{` ExportsList `,` `}`
1250
1251ExportsList :
1252  ExportSpecifier
1253  ExportsList `,` ExportSpecifier
1254
1255ExportSpecifier :
1256  IdentifierName
1257  IdentifierName `as` IdentifierName
1258
1259
1260uri :::
1261  uriCharacters?
1262
1263uriCharacters :::
1264  uriCharacter uriCharacters?
1265
1266uriCharacter :::
1267  uriReserved
1268  uriUnescaped
1269  uriEscaped
1270
1271uriReserved ::: one of
1272  `;` `/` `?` `:` `@` `&` `=` `+` `$` `,`
1273
1274uriUnescaped :::
1275  uriAlpha
1276  DecimalDigit
1277  uriMark
1278
1279uriEscaped :::
1280  `%` HexDigit HexDigit
1281
1282uriAlpha ::: one of
1283  `a` `b` `c` `d` `e` `f` `g` `h` `i` `j` `k` `l` `m` `n` `o` `p` `q` `r` `s` `t` `u` `v` `w` `x` `y` `z`
1284  `A` `B` `C` `D` `E` `F` `G` `H` `I` `J` `K` `L` `M` `N` `O` `P` `Q` `R` `S` `T` `U` `V` `W` `X` `Y` `Z`
1285
1286uriMark ::: one of
1287  `-` `_` `.` `!` `~` `*` `'` `(` `)`
1288
1289
1290NativeFunction :
1291  `function` PropertyName[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` `[` `native` `code` `]` `}`
1292
1293
1294Pattern[U, N] ::
1295  Disjunction[?U, ?N]
1296
1297Disjunction[U, N] ::
1298  Alternative[?U, ?N]
1299  Alternative[?U, ?N] `|` Disjunction[?U, ?N]
1300
1301Alternative[U, N] ::
1302  [empty]
1303  Alternative[?U, ?N] Term[?U, ?N]
1304
1305Term[U, N] ::
1306  Assertion[?U, ?N]
1307  Atom[?U, ?N]
1308  Atom[?U, ?N] Quantifier
1309
1310Assertion[U, N] ::
1311  `^`
1312  `$`
1313  `\` `b`
1314  `\` `B`
1315  `(` `?` `=` Disjunction[?U, ?N] `)`
1316  `(` `?` `!` Disjunction[?U, ?N] `)`
1317  `(` `?` `<=` Disjunction[?U, ?N] `)`
1318  `(` `?` `<!` Disjunction[?U, ?N] `)`
1319
1320Quantifier ::
1321  QuantifierPrefix
1322  QuantifierPrefix `?`
1323
1324QuantifierPrefix ::
1325  `*`
1326  `+`
1327  `?`
1328  `{` DecimalDigits `}`
1329  `{` DecimalDigits `,` `}`
1330  `{` DecimalDigits `,` DecimalDigits `}`
1331
1332Atom[U, N] ::
1333  PatternCharacter
1334  `.`
1335  `\` AtomEscape[?U, ?N]
1336  CharacterClass[?U]
1337  `(` GroupSpecifier[?U] Disjunction[?U, ?N] `)`
1338  `(` `?` `:` Disjunction[?U, ?N] `)`
1339
1340SyntaxCharacter :: one of
1341  `^` `$` `\` `.` `*` `+` `?` `(` `)` `[` `]` `{` `}` `|`
1342
1343PatternCharacter ::
1344  SourceCharacter but not SyntaxCharacter
1345
1346AtomEscape[U, N] ::
1347  DecimalEscape
1348  CharacterClassEscape[?U]
1349  CharacterEscape[?U]
1350  [+N] `k` GroupName[?U]
1351
1352CharacterEscape[U] ::
1353  ControlEscape
1354  `c` ControlLetter
1355  `0` [lookahead <! DecimalDigit]
1356  HexEscapeSequence
1357  RegExpUnicodeEscapeSequence[?U]
1358  IdentityEscape[?U]
1359
1360ControlEscape :: one of
1361  `f` `n` `r` `t` `v`
1362
1363ControlLetter :: one of
1364  `a` `b` `c` `d` `e` `f` `g` `h` `i` `j` `k` `l` `m` `n` `o` `p` `q` `r` `s` `t` `u` `v` `w` `x` `y` `z`
1365  `A` `B` `C` `D` `E` `F` `G` `H` `I` `J` `K` `L` `M` `N` `O` `P` `Q` `R` `S` `T` `U` `V` `W` `X` `Y` `Z`
1366
1367GroupSpecifier[U] ::
1368  [empty]
1369  `?` GroupName[?U]
1370
1371GroupName[U] ::
1372  `<` RegExpIdentifierName[?U] `>`
1373
1374RegExpIdentifierName[U] ::
1375  RegExpIdentifierStart[?U]
1376  RegExpIdentifierName[?U] RegExpIdentifierPart[?U]
1377
1378RegExpIdentifierStart[U] ::
1379  UnicodeIDStart
1380  `$`
1381  `_`
1382  `\` RegExpUnicodeEscapeSequence[?U]
1383
1384RegExpIdentifierPart[U] ::
1385  UnicodeIDContinue
1386  `$`
1387  `\` RegExpUnicodeEscapeSequence[?U]
1388  <ZWNJ>
1389  <ZWJ>
1390
1391RegExpUnicodeEscapeSequence[U] ::
1392  [+U] `u` LeadSurrogate `\u` TrailSurrogate
1393  [+U] `u` LeadSurrogate
1394  [+U] `u` TrailSurrogate
1395  [+U] `u` NonSurrogate
1396  [~U] `u` Hex4Digits
1397  [+U] `u{` CodePoint `}`
1398
1399
1400LeadSurrogate ::
1401  Hex4Digits [> but only if the SV of |Hex4Digits| is in the inclusive range 0xD800 to 0xDBFF]
1402
1403TrailSurrogate ::
1404  Hex4Digits [> but only if the SV of |Hex4Digits| is in the inclusive range 0xDC00 to 0xDFFF]
1405
1406NonSurrogate ::
1407  Hex4Digits [> but only if the SV of |Hex4Digits| is not in the inclusive range 0xD800 to 0xDFFF]
1408
1409IdentityEscape[U] ::
1410  [+U] SyntaxCharacter
1411  [+U] `/`
1412  [~U] SourceCharacter but not UnicodeIDContinue
1413
1414DecimalEscape ::
1415  NonZeroDigit DecimalDigits? [lookahead <! DecimalDigit]
1416
1417CharacterClassEscape[U] ::
1418  `d`
1419  `D`
1420  `s`
1421  `S`
1422  `w`
1423  `W`
1424  [+U] `p{` UnicodePropertyValueExpression `}`
1425  [+U] `P{` UnicodePropertyValueExpression `}`
1426
1427UnicodePropertyValueExpression ::
1428  UnicodePropertyName `=` UnicodePropertyValue
1429  LoneUnicodePropertyNameOrValue
1430
1431UnicodePropertyName ::
1432  UnicodePropertyNameCharacters
1433
1434UnicodePropertyNameCharacters ::
1435  UnicodePropertyNameCharacter UnicodePropertyNameCharacters?
1436
1437UnicodePropertyValue ::
1438  UnicodePropertyValueCharacters
1439
1440LoneUnicodePropertyNameOrValue ::
1441  UnicodePropertyValueCharacters
1442
1443UnicodePropertyValueCharacters ::
1444  UnicodePropertyValueCharacter UnicodePropertyValueCharacters?
1445
1446UnicodePropertyValueCharacter ::
1447  UnicodePropertyNameCharacter
1448  `0`
1449  `1`
1450  `2`
1451  `3`
1452  `4`
1453  `5`
1454  `6`
1455  `7`
1456  `8`
1457  `9`
1458
1459UnicodePropertyNameCharacter ::
1460  ControlLetter
1461  `_`
1462
1463CharacterClass[U] ::
1464  `[` [lookahead != `^`] ClassRanges[?U] `]`
1465  `[` `^` ClassRanges[?U] `]`
1466
1467ClassRanges[U] ::
1468  [empty]
1469  NonemptyClassRanges[?U]
1470
1471NonemptyClassRanges[U] ::
1472  ClassAtom[?U]
1473  ClassAtom[?U] NonemptyClassRangesNoDash[?U]
1474  ClassAtom[?U] `-` ClassAtom[?U] ClassRanges[?U]
1475
1476NonemptyClassRangesNoDash[U] ::
1477  ClassAtom[?U]
1478  ClassAtomNoDash[?U] NonemptyClassRangesNoDash[?U]
1479  ClassAtomNoDash[?U] `-` ClassAtom[?U] ClassRanges[?U]
1480
1481ClassAtom[U] ::
1482  `-`
1483  ClassAtomNoDash[?U]
1484
1485ClassAtomNoDash[U] ::
1486  SourceCharacter but not one of `\` or `]` or `-`
1487  `\` ClassEscape[?U]
1488
1489ClassEscape[U] ::
1490  `b`
1491  [+U] `-`
1492  CharacterClassEscape[?U]
1493  CharacterEscape[?U]
1494
1495
1496NumericLiteral ::
1497  DecimalLiteral
1498  BinaryIntegerLiteral
1499  OctalIntegerLiteral
1500  HexIntegerLiteral
1501  LegacyOctalIntegerLiteral
1502
1503LegacyOctalIntegerLiteral ::
1504  `0` OctalDigit
1505  LegacyOctalIntegerLiteral OctalDigit
1506
1507DecimalIntegerLiteral ::
1508  `0`
1509  NonZeroDigit DecimalDigits?
1510  NonOctalDecimalIntegerLiteral
1511
1512NonOctalDecimalIntegerLiteral ::
1513  `0` NonOctalDigit
1514  LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit
1515  NonOctalDecimalIntegerLiteral DecimalDigit
1516
1517LegacyOctalLikeDecimalIntegerLiteral ::
1518  `0` OctalDigit
1519  LegacyOctalLikeDecimalIntegerLiteral OctalDigit
1520
1521NonOctalDigit :: one of
1522  `8` `9`
1523
1524
1525EscapeSequence ::
1526  CharacterEscapeSequence
1527  LegacyOctalEscapeSequence
1528  HexEscapeSequence
1529  UnicodeEscapeSequence
1530
1531LegacyOctalEscapeSequence ::
1532  OctalDigit [lookahead <! OctalDigit]
1533  ZeroToThree OctalDigit [lookahead <! OctalDigit]
1534  FourToSeven OctalDigit
1535  ZeroToThree OctalDigit OctalDigit
1536
1537ZeroToThree :: one of
1538  `0` `1` `2` `3`
1539
1540FourToSeven :: one of
1541  `4` `5` `6` `7`
1542
1543
1544Comment ::
1545  MultiLineComment
1546  SingleLineComment
1547  SingleLineHTMLOpenComment
1548  SingleLineHTMLCloseComment
1549  SingleLineDelimitedComment
1550
1551MultiLineComment ::
1552  `/*` FirstCommentLine? LineTerminator MultiLineCommentChars? `*/` HTMLCloseComment?
1553
1554FirstCommentLine ::
1555  SingleLineDelimitedCommentChars
1556
1557SingleLineHTMLOpenComment ::
1558  `<!--` SingleLineCommentChars?
1559
1560SingleLineHTMLCloseComment ::
1561  LineTerminatorSequence HTMLCloseComment
1562
1563SingleLineDelimitedComment ::
1564  `/*` SingleLineDelimitedCommentChars? `*/`
1565
1566HTMLCloseComment ::
1567  WhiteSpaceSequence? SingleLineDelimitedCommentSequence? `-->` SingleLineCommentChars?
1568
1569SingleLineDelimitedCommentChars ::
1570  SingleLineNotAsteriskChar SingleLineDelimitedCommentChars?
1571  `*` SingleLinePostAsteriskCommentChars?
1572
1573SingleLineNotAsteriskChar ::
1574  SourceCharacter but not one of `*` or LineTerminator
1575
1576SingleLinePostAsteriskCommentChars ::
1577  SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentChars?
1578  `*` SingleLinePostAsteriskCommentChars?
1579
1580SingleLineNotForwardSlashOrAsteriskChar ::
1581  SourceCharacter but not one of `/` or `*` or LineTerminator
1582
1583WhiteSpaceSequence ::
1584  WhiteSpace WhiteSpaceSequence?
1585
1586SingleLineDelimitedCommentSequence ::
1587  SingleLineDelimitedComment WhiteSpaceSequence? SingleLineDelimitedCommentSequence?
1588
1589
1590Term[U, N] ::
1591  [+U] Assertion[+U, ?N]
1592  [+U] Atom[+U, ?N]
1593  [+U] Atom[+U, ?N] Quantifier
1594  [~U] QuantifiableAssertion[?N] Quantifier
1595  [~U] Assertion[~U, ?N]
1596  [~U] ExtendedAtom[?N] Quantifier
1597  [~U] ExtendedAtom[?N]
1598
1599Assertion[U, N] ::
1600  `^`
1601  `$`
1602  `\` `b`
1603  `\` `B`
1604  [+U] `(` `?` `=` Disjunction[+U, ?N] `)`
1605  [+U] `(` `?` `!` Disjunction[+U, ?N] `)`
1606  [~U] QuantifiableAssertion[?N]
1607  `(` `?` `<=` Disjunction[?U, ?N] `)`
1608  `(` `?` `<!` Disjunction[?U, ?N] `)`
1609
1610QuantifiableAssertion[N] ::
1611  `(` `?` `=` Disjunction[~U, ?N] `)`
1612  `(` `?` `!` Disjunction[~U, ?N] `)`
1613
1614ExtendedAtom[N] ::
1615  `.`
1616  `\` AtomEscape[~U, ?N]
1617  `\` [lookahead == `c`]
1618  CharacterClass[~U]
1619  `(` Disjunction[~U, ?N] `)`
1620  `(` `?` `:` Disjunction[~U, ?N] `)`
1621  InvalidBracedQuantifier
1622  ExtendedPatternCharacter
1623
1624InvalidBracedQuantifier ::
1625  `{` DecimalDigits `}`
1626  `{` DecimalDigits `,` `}`
1627  `{` DecimalDigits `,` DecimalDigits `}`
1628
1629ExtendedPatternCharacter ::
1630  SourceCharacter but not one of `^` `$` `\` `.` `*` `+` `?` `(` `)` `[` `|`
1631
1632AtomEscape[U, N] ::
1633  [+U] DecimalEscape
1634  [~U] DecimalEscape [> but only if the CapturingGroupNumber of |DecimalEscape| is <= _NcapturingParens_]
1635  CharacterClassEscape[?U]
1636  CharacterEscape[~U, ?N]
1637  [+N] `k` GroupName[?U]
1638
1639CharacterEscape[U, N] ::
1640  ControlEscape
1641  `c` ControlLetter
1642  `0` [lookahead <! DecimalDigit]
1643  HexEscapeSequence
1644  RegExpUnicodeEscapeSequence[?U]
1645  [~U] LegacyOctalEscapeSequence
1646  IdentityEscape[?U, ?N]
1647
1648IdentityEscape[U, N] ::
1649  [+U] SyntaxCharacter
1650  [+U] `/`
1651  [~U] SourceCharacterIdentityEscape[?N]
1652
1653SourceCharacterIdentityEscape[N] ::
1654  [~N] SourceCharacter but not `c`
1655  [+N] SourceCharacter but not one of `c` or `k`
1656
1657ClassAtomNoDash[U] ::
1658  SourceCharacter but not one of `\` or `]` or `-`
1659  `\` ClassEscape[?U, ~N]
1660  `\` [lookahead == `c`]
1661
1662ClassEscape[U, N] ::
1663  `b`
1664  [+U] `-`
1665  [~U] `c` ClassControlLetter
1666  CharacterClassEscape[?U]
1667  CharacterEscape[?U, ?N]
1668
1669ClassControlLetter ::
1670  DecimalDigit
1671  `_`
1672
1673
1674IfStatement[Yield, Await, Return] :
1675  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` Statement[?Yield, ?Await, ?Return]
1676  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` FunctionDeclaration[?Yield, ?Await, ~Default]
1677  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` FunctionDeclaration[?Yield, ?Await, ~Default]
1678  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default]
1679
1680
1681IterationStatement[Yield, Await, Return] :
1682  `for` `(` `var` BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
1683
1684