1@returns Identifier
2IdentifierReference[Yield, Await] :
3  Identifier
4    => identifier_reference($0)
5
6@returns BindingIdentifier
7BindingIdentifier[Yield, Await] :
8  Identifier
9    => binding_identifier($0)
10  `yield`
11    => binding_identifier_yield($0)
12  `await`
13    => binding_identifier_await($0)
14
15@returns Label
16LabelIdentifier[Yield, Await] :
17  Identifier
18    => label_identifier($0)
19
20@returns Expression
21PrimaryExpression[Yield, Await] :
22  `this`
23    => this_expr($0)
24  IdentifierReference[?Yield, ?Await]
25    => identifier_expr($0)
26  Literal
27    => $0
28  ArrayLiteral[?Yield, ?Await]
29    => $0
30  ObjectLiteral[?Yield, ?Await]
31    => $0
32  FunctionExpression
33    => $0
34  ClassExpression[?Yield, ?Await]
35    => $0
36  GeneratorExpression
37    => $0
38  AsyncFunctionExpression
39    => $0
40  AsyncGeneratorExpression
41    => $0
42  RegularExpressionLiteral
43    => regexp_literal($0)
44  TemplateLiteral[?Yield, ?Await, ~Tagged]
45    => untagged_template_expr($0)
46  CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
47    => uncover_parenthesized_expression($0)
48
49@returns CoverParenthesized
50CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] :
51  `(` Expression[+In, ?Yield, ?Await] `)`
52    => cover_parenthesized_expression($0, $1, $2)
53  `(` Expression[+In, ?Yield, ?Await] `,` `)`
54    => cover_arrow_parameter_list($0, expression_to_parameter_list($1), None, $3)
55  `(` `)`
56    => cover_arrow_parameter_list($0, empty_parameter_list(), None, $1)
57  `(` `...` BindingIdentifier[?Yield, ?Await] `)`
58    => cover_arrow_parameter_list($0, empty_parameter_list(), Some(binding_identifier_to_binding($2)), $3)
59  `(` `...` BindingPattern[?Yield, ?Await] `)`
60    => cover_arrow_parameter_list($0, empty_parameter_list(), Some($2), $3)
61  `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingIdentifier[?Yield, ?Await] `)`
62    => cover_arrow_parameter_list($0, expression_to_parameter_list($1), Some(binding_identifier_to_binding($4)), $5)
63  `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingPattern[?Yield, ?Await] `)`
64    => cover_arrow_parameter_list($0, expression_to_parameter_list($1), Some($4), $5)
65
66
67@returns Expression
68Literal :
69  NullLiteral
70    => null_literal($0)
71  BooleanLiteral
72    => boolean_literal($0)
73  NumericLiteral
74    => numeric_literal($0)
75  BigIntLiteral
76    => bigint_literal($0)
77  StringLiteral
78    => string_literal($0)
79
80
81@returns Expression
82ArrayLiteral[Yield, Await] :
83  `[` Elision? `]`
84    => array_literal_empty($0, $1, $2)
85  `[` ElementList[?Yield, ?Await] `]`
86    => array_literal($0, $1, $2)
87  `[` ElementList[?Yield, ?Await] `,` Elision? `]`
88    => array_literal_with_trailing_elision($0,$1, $3, $4)
89
90@returns ArrayExpression
91ElementList[Yield, Await] :
92  Elision? AssignmentExpression[+In, ?Yield, ?Await]
93    => element_list_first($0, $1)
94  Elision? SpreadElement[?Yield, ?Await]
95    => element_list_first_spread($0, $1)
96  ElementList[?Yield, ?Await] `,` Elision? AssignmentExpression[+In, ?Yield, ?Await]
97    => element_list_append($0, $2, $3)
98  ElementList[?Yield, ?Await] `,` Elision? SpreadElement[?Yield, ?Await]
99    => element_list_append_spread($0, $2, $3)
100
101@returns ArrayExpression
102Elision :
103  `,`
104    => elision_single($0)
105  Elision `,`
106    => elision_append($0, $1)
107
108@returns Expression
109SpreadElement[Yield, Await] :
110  `...` AssignmentExpression[+In, ?Yield, ?Await]
111    => spread_element($1)
112
113
114@returns Expression
115ObjectLiteral[Yield, Await] :
116  `{` `}`
117    => object_literal_empty($0, $1)
118  `{` PropertyDefinitionList[?Yield, ?Await] `}`
119    => object_literal($0, $1, $2)
120  `{` PropertyDefinitionList[?Yield, ?Await] `,` `}`
121    => object_literal($0, $1, $2)
122
123@returns ObjectExpression
124PropertyDefinitionList[Yield, Await] :
125  PropertyDefinition[?Yield, ?Await]
126    => property_definition_list_single($0)
127  PropertyDefinitionList[?Yield, ?Await] `,` PropertyDefinition[?Yield, ?Await]
128    => property_definition_list_append($0, $2)
129
130@returns ObjectProperty
131PropertyDefinition[Yield, Await] :
132  IdentifierReference[?Yield, ?Await]
133    => shorthand_property($0)
134  CoverInitializedName[?Yield, ?Await]
135    => $0
136  PropertyName[?Yield, ?Await] `:` AssignmentExpression[+In, ?Yield, ?Await]
137    => property_definition($0, $2)
138  MethodDefinition[?Yield, ?Await]
139    => property_definition_method($0)
140  `...` AssignmentExpression[+In, ?Yield, ?Await]
141    => property_definition_spread($1)
142
143@returns PropertyName
144PropertyName[Yield, Await] :
145  LiteralPropertyName
146    => $0
147  ComputedPropertyName[?Yield, ?Await]
148    => $0
149
150@returns PropertyName
151LiteralPropertyName :
152  IdentifierName
153    => property_name_identifier($0)
154  StringLiteral
155    => property_name_string($0)
156  NumericLiteral
157    => property_name_numeric($0)
158  BigIntLiteral
159    => property_name_bigint($0)
160
161@returns PropertyName
162ComputedPropertyName[Yield, Await] :
163  `[` AssignmentExpression[+In, ?Yield, ?Await] `]`
164    => computed_property_name($0, $1, $2)
165
166@returns ObjectProperty
167CoverInitializedName[Yield, Await] :
168  IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
169    => cover_initialized_name($0, $1)
170
171@returns Expression
172Initializer[In, Yield, Await] :
173  `=` AssignmentExpression[?In, ?Yield, ?Await]
174    => $1
175
176
177@returns TemplateExpression
178TemplateLiteral[Yield, Await, Tagged] :
179  NoSubstitutionTemplate
180    => template_literal($0)
181  SubstitutionTemplate[?Yield, ?Await, ?Tagged]
182    => $0
183
184@returns TemplateExpression
185SubstitutionTemplate[Yield, Await, Tagged] :
186  TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
187    => substitution_template($0, $1, $2)
188
189@returns Void
190TemplateSpans[Yield, Await, Tagged] :
191  TemplateTail
192    => template_spans(None, $0)
193  TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail
194    => template_spans(Some($0), $1)
195
196@returns Void
197TemplateMiddleList[Yield, Await, Tagged] :
198  TemplateMiddle Expression[+In, ?Yield, ?Await]
199    => template_middle_list_single($0, $1)
200  TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]
201    => template_middle_list_append($0, $1, $2)
202
203@returns Expression
204MemberExpression[Yield, Await] :
205  PrimaryExpression[?Yield, ?Await]
206    => $0
207  MemberExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
208    => computed_member_expr($0, $2, $3)
209  MemberExpression[?Yield, ?Await] `.` IdentifierName
210    => static_member_expr($0, $2)
211  MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
212    => tagged_template_expr($0, $1)
213  SuperProperty[?Yield, ?Await]
214    => $0
215  MetaProperty
216    => $0
217  `new` MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
218    => new_expr_with_arguments($0, $1, $2)
219  MemberExpression[?Yield, ?Await] `.` PrivateIdentifier
220    => private_field_expr($0, $2)
221
222@returns Expression
223SuperProperty[Yield, Await] :
224  `super` `[` Expression[+In, ?Yield, ?Await] `]`
225    => super_property_computed($0, $2, $3)
226  `super` `.` IdentifierName
227    => super_property_static($0, $2)
228
229@returns Expression
230MetaProperty :
231  NewTarget
232    => $0
233
234@returns Expression
235NewTarget :
236  `new` `.` `target`
237    => new_target_expr($0, $2)
238
239@returns Expression
240NewExpression[Yield, Await] :
241  MemberExpression[?Yield, ?Await]
242    => $0
243  `new` NewExpression[?Yield, ?Await]
244    => new_expr_without_arguments($0, $1)
245
246@returns Expression
247CallExpression[Yield, Await] :
248  CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
249    => $0
250  SuperCall[?Yield, ?Await]
251    => $0
252  ImportCall[?Yield, ?Await]
253    => $0
254  CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
255    => call_expr($0, $1)
256  CallExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
257    => computed_member_expr($0, $2, $3)
258  CallExpression[?Yield, ?Await] `.` IdentifierName
259    => static_member_expr($0, $2)
260  CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
261    => tagged_template_expr($0, $1)
262  CallExpression[?Yield, ?Await] `.` PrivateIdentifier
263    => private_field_expr($0, $2)
264
265@returns Expression
266SuperCall[Yield, Await] :
267  `super` Arguments[?Yield, ?Await]
268    => super_call($0, $1)
269
270@returns Expression
271ImportCall[Yield, Await] :
272  `import` `(` AssignmentExpression[+In, ?Yield, ?Await] `)`
273    => import_call($0, $2, $3)
274
275@returns Arguments
276Arguments[Yield, Await] :
277  `(` `)`
278    => arguments_empty($0, $1)
279  `(` ArgumentList[?Yield, ?Await] `)`
280    => arguments($0, $1, $2)
281  `(` ArgumentList[?Yield, ?Await] `,` `)`
282    => arguments($0, $1, $3)
283
284@returns Arguments
285ArgumentList[Yield, Await] :
286  AssignmentExpression[+In, ?Yield, ?Await]
287    => arguments_single($0)
288  `...` AssignmentExpression[+In, ?Yield, ?Await]
289    => arguments_spread_single($1)
290  ArgumentList[?Yield, ?Await] `,` AssignmentExpression[+In, ?Yield, ?Await]
291    => arguments_append($0, $2)
292  ArgumentList[?Yield, ?Await] `,` `...` AssignmentExpression[+In, ?Yield, ?Await]
293    => arguments_append_spread($0, $3)
294
295@returns Expression
296OptionalExpression[Yield, Await] :
297  MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
298    => optional_expr($0, $1)
299  CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
300    => optional_expr($0, $1)
301  OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
302    => optional_expr($0, $1)
303
304@returns Expression
305OptionalChain[Yield, Await] :
306  `?.` `[` Expression[+In, ?Yield, ?Await] `]`
307    => optional_computed_member_expr_tail($0, $2, $3)
308  `?.` IdentifierName
309    => optional_static_member_expr_tail($0, $1)
310  `?.` PrivateIdentifier
311    => optional_private_field_member_expr_tail($0, $1)
312  `?.` Arguments[?Yield, ?Await]
313    => optional_call_expr_tail($0, $1)
314  `?.` TemplateLiteral[?Yield, ?Await, +Tagged]
315    => error_optional_chain_with_template()
316  OptionalChain[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
317    => optional_computed_member_expr($0, $2, $3)
318  OptionalChain[?Yield, ?Await] `.` IdentifierName
319    => optional_static_member_expr($0, $2)
320  OptionalChain[?Yield, ?Await] `.` PrivateIdentifier
321    => optional_private_field_member_expr($0, $2)
322  OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await]
323    => optional_call_expr($0, $1)
324  OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
325    => error_optional_chain_with_template()
326
327@returns Expression
328LeftHandSideExpression[Yield, Await] :
329  NewExpression[?Yield, ?Await]
330    => $0
331  CallExpression[?Yield, ?Await]
332    => $0
333  OptionalExpression[?Yield, ?Await]
334    => $0
335
336
337@returns Expression
338CallMemberExpression[Yield, Await] :
339  MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
340    => call_expr($0, $1)
341
342
343@returns Expression
344UpdateExpression[Yield, Await] :
345  LeftHandSideExpression[?Yield, ?Await]
346    => $0
347  LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] `++`
348    => post_increment_expr($0, $1)
349  LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] `--`
350    => post_decrement_expr($0, $1)
351  `++` UnaryExpression[?Yield, ?Await]
352    => pre_decrement_expr($0, $1)
353  `--` UnaryExpression[?Yield, ?Await]
354    => pre_decrement_expr($0, $1)
355
356
357@returns Expression
358UnaryExpression[Yield, Await] :
359  UpdateExpression[?Yield, ?Await]
360    => $0
361  `delete` UnaryExpression[?Yield, ?Await]
362    => delete_expr($0, $1)
363  `void` UnaryExpression[?Yield, ?Await]
364    => void_expr($0, $1)
365  `typeof` UnaryExpression[?Yield, ?Await]
366    => typeof_expr($0, $1)
367  `+` UnaryExpression[?Yield, ?Await]
368    => unary_plus_expr($0, $1)
369  `-` UnaryExpression[?Yield, ?Await]
370    => unary_minus_expr($0, $1)
371  `~` UnaryExpression[?Yield, ?Await]
372    => bitwise_not_expr($0, $1)
373  `!` UnaryExpression[?Yield, ?Await]
374    => logical_not_expr($0, $1)
375  [+Await] AwaitExpression[?Yield]
376    => $0
377
378
379@returns Expression
380ExponentiationExpression[Yield, Await] :
381  UnaryExpression[?Yield, ?Await]
382    => $0
383  UpdateExpression[?Yield, ?Await] `**` ExponentiationExpression[?Yield, ?Await]
384    => binary_expr(pow_op($1), $0, $2)
385
386
387@returns Expression
388MultiplicativeExpression[Yield, Await] :
389  ExponentiationExpression[?Yield, ?Await]
390    => $0
391  MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await]
392    => multiplicative_expr($0, $1, $2)
393
394@returns BinaryOperator
395MultiplicativeOperator :
396  `*`
397    => box_op(mul_op($0))
398  `/`
399    => box_op(div_op($0))
400  `%`
401    => box_op(mod_op($0))
402
403
404@returns Expression
405AdditiveExpression[Yield, Await] :
406  MultiplicativeExpression[?Yield, ?Await]
407    => $0
408  AdditiveExpression[?Yield, ?Await] `+` MultiplicativeExpression[?Yield, ?Await]
409    => binary_expr(add_op($1), $0, $2)
410  AdditiveExpression[?Yield, ?Await] `-` MultiplicativeExpression[?Yield, ?Await]
411    => binary_expr(sub_op($1), $0, $2)
412
413
414@returns Expression
415ShiftExpression[Yield, Await] :
416  AdditiveExpression[?Yield, ?Await]
417    => $0
418  ShiftExpression[?Yield, ?Await] `<<` AdditiveExpression[?Yield, ?Await]
419    => binary_expr(left_shift_op($1), $0, $2)
420  ShiftExpression[?Yield, ?Await] `>>` AdditiveExpression[?Yield, ?Await]
421    => binary_expr(right_shift_op($1), $0, $2)
422  ShiftExpression[?Yield, ?Await] `>>>` AdditiveExpression[?Yield, ?Await]
423    => binary_expr(right_shift_ext_op($1), $0, $2)
424
425
426@returns Expression
427RelationalExpression[In, Yield, Await] :
428  ShiftExpression[?Yield, ?Await]
429    => $0
430  RelationalExpression[?In, ?Yield, ?Await] `<` ShiftExpression[?Yield, ?Await]
431    => binary_expr(less_than_op($1), $0, $2)
432  RelationalExpression[?In, ?Yield, ?Await] `>` ShiftExpression[?Yield, ?Await]
433    => binary_expr(greater_than_op($1), $0, $2)
434  RelationalExpression[?In, ?Yield, ?Await] `<=` ShiftExpression[?Yield, ?Await]
435    => binary_expr(less_than_or_equal_op($1), $0, $2)
436  RelationalExpression[?In, ?Yield, ?Await] `>=` ShiftExpression[?Yield, ?Await]
437    => binary_expr(greater_than_or_equal_op($1), $0, $2)
438  RelationalExpression[?In, ?Yield, ?Await] `instanceof` ShiftExpression[?Yield, ?Await]
439    => binary_expr(instanceof_op($1), $0, $2)
440  [+In] RelationalExpression[+In, ?Yield, ?Await] `in` ShiftExpression[?Yield, ?Await]
441    => binary_expr(in_op($1), $0, $2)
442
443
444@returns Expression
445EqualityExpression[In, Yield, Await] :
446  RelationalExpression[?In, ?Yield, ?Await]
447    => $0
448  EqualityExpression[?In, ?Yield, ?Await] `==` RelationalExpression[?In, ?Yield, ?Await]
449    => binary_expr(equals_op($1), $0, $2)
450  EqualityExpression[?In, ?Yield, ?Await] `!=` RelationalExpression[?In, ?Yield, ?Await]
451    => binary_expr(not_equals_op($1), $0, $2)
452  EqualityExpression[?In, ?Yield, ?Await] `===` RelationalExpression[?In, ?Yield, ?Await]
453    => binary_expr(strict_equals_op($1), $0, $2)
454  EqualityExpression[?In, ?Yield, ?Await] `!==` RelationalExpression[?In, ?Yield, ?Await]
455    => binary_expr(strict_not_equals_op($1), $0, $2)
456
457
458@returns Expression
459BitwiseANDExpression[In, Yield, Await] :
460  EqualityExpression[?In, ?Yield, ?Await]
461    => $0
462  BitwiseANDExpression[?In, ?Yield, ?Await] `&` EqualityExpression[?In, ?Yield, ?Await]
463    => binary_expr(bitwise_and_op($1), $0, $2)
464
465@returns Expression
466BitwiseXORExpression[In, Yield, Await] :
467  BitwiseANDExpression[?In, ?Yield, ?Await]
468    => $0
469  BitwiseXORExpression[?In, ?Yield, ?Await] `^` BitwiseANDExpression[?In, ?Yield, ?Await]
470    => binary_expr(bitwise_xor_op($1), $0, $2)
471
472@returns Expression
473BitwiseORExpression[In, Yield, Await] :
474  BitwiseXORExpression[?In, ?Yield, ?Await]
475    => $0
476  BitwiseORExpression[?In, ?Yield, ?Await] `|` BitwiseXORExpression[?In, ?Yield, ?Await]
477    => binary_expr(bitwise_or_op($1), $0, $2)
478
479@returns Expression
480LogicalANDExpression[In, Yield, Await] :
481  BitwiseORExpression[?In, ?Yield, ?Await]
482    => $0
483  LogicalANDExpression[?In, ?Yield, ?Await] `&&` BitwiseORExpression[?In, ?Yield, ?Await]
484    => binary_expr(logical_and_op($1), $0, $2)
485
486@returns Expression
487LogicalORExpression[In, Yield, Await] :
488  LogicalANDExpression[?In, ?Yield, ?Await]
489    => $0
490  LogicalORExpression[?In, ?Yield, ?Await] `||` LogicalANDExpression[?In, ?Yield, ?Await]
491    => binary_expr(logical_or_op($1), $0, $2)
492
493@returns Expression
494ShortCircuitExpression[In, Yield, Await] :
495  LogicalORExpression[?In, ?Yield, ?Await]
496    => $0
497  CoalesceExpression[?In, ?Yield, ?Await]
498    => $0
499
500@returns Expression
501CoalesceExpression[In, Yield, Await] :
502  CoalesceExpressionHead[?In, ?Yield, ?Await] `??` BitwiseORExpression[?In, ?Yield, ?Await]
503    => binary_expr(coalesce_op($1), $0, $2)
504
505@returns Expression
506CoalesceExpressionHead[In, Yield, Await] :
507  CoalesceExpression[?In, ?Yield, ?Await]
508    => $0
509  BitwiseORExpression[?In, ?Yield, ?Await]
510    => $0
511
512@returns Expression
513ConditionalExpression[In, Yield, Await] :
514  ShortCircuitExpression[?In, ?Yield, ?Await]
515    => $0
516  ShortCircuitExpression[?In, ?Yield, ?Await] `?` AssignmentExpression[+In, ?Yield, ?Await] `:` AssignmentExpression[?In, ?Yield, ?Await]
517    => conditional_expr($0, $2, $4)
518
519
520@returns Expression
521AssignmentExpression[In, Yield, Await] :
522  ConditionalExpression[?In, ?Yield, ?Await]
523    => $0
524  [+Yield] YieldExpression[?In, ?Await]
525    => $0
526  ArrowFunction[?In, ?Yield, ?Await]
527    => $0
528  AsyncArrowFunction[?In, ?Yield, ?Await]
529    => $0
530  LeftHandSideExpression[?Yield, ?Await] `=` AssignmentExpression[?In, ?Yield, ?Await]
531    => assignment_expr($0, $2)
532  LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await]
533    => compound_assignment_expr($0, $1, $2)
534  LeftHandSideExpression[?Yield, ?Await] LogicalAssignmentOperator AssignmentExpression[?In, ?Yield, ?Await]
535    => compound_assignment_expr($0, $1, $2)
536
537@returns CompoundAssignmentOperator
538AssignmentOperator :
539  `*=`
540    => box_assign_op(mul_assign_op($0))
541  `/=`
542    => box_assign_op(div_assign_op($0))
543  `%=`
544    => box_assign_op(mod_assign_op($0))
545  `+=`
546    => box_assign_op(add_assign_op($0))
547  `-=`
548    => box_assign_op(sub_assign_op($0))
549  `<<=`
550    => box_assign_op(left_shift_assign_op($0))
551  `>>=`
552    => box_assign_op(right_shift_assign_op($0))
553  `>>>=`
554    => box_assign_op(right_shift_ext_assign_op($0))
555  `&=`
556    => box_assign_op(bitwise_and_assign_op($0))
557  `^=`
558    => box_assign_op(bitwise_xor_assign_op($0))
559  `|=`
560    => box_assign_op(bitwise_or_assign_op($0))
561  `**=`
562    => box_assign_op(pow_assign_op($0))
563
564@returns CompoundAssignmentOperator
565LogicalAssignmentOperator :
566  `&&=`
567    => box_assign_op(logical_and_assign_op($0))
568  `||=`
569    => box_assign_op(logical_or_assign_op($0))
570  `??=`
571    => box_assign_op(coalesce_assign_op($0))
572
573AssignmentPattern[Yield, Await] :
574  ObjectAssignmentPattern[?Yield, ?Await]
575  ArrayAssignmentPattern[?Yield, ?Await]
576
577ObjectAssignmentPattern[Yield, Await] :
578  `{` `}`
579  `{` AssignmentRestProperty[?Yield, ?Await] `}`
580  `{` AssignmentPropertyList[?Yield, ?Await] `}`
581  `{` AssignmentPropertyList[?Yield, ?Await] `,` AssignmentRestProperty[?Yield, ?Await]? `}`
582
583ArrayAssignmentPattern[Yield, Await] :
584  `[` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
585  `[` AssignmentElementList[?Yield, ?Await] `]`
586  `[` AssignmentElementList[?Yield, ?Await] `,` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
587
588AssignmentRestProperty[Yield, Await] :
589  `...` DestructuringAssignmentTarget[?Yield, ?Await]
590
591AssignmentPropertyList[Yield, Await] :
592  AssignmentProperty[?Yield, ?Await]
593  AssignmentPropertyList[?Yield, ?Await] `,` AssignmentProperty[?Yield, ?Await]
594
595AssignmentElementList[Yield, Await] :
596  AssignmentElisionElement[?Yield, ?Await]
597  AssignmentElementList[?Yield, ?Await] `,` AssignmentElisionElement[?Yield, ?Await]
598
599AssignmentElisionElement[Yield, Await] :
600  Elision? AssignmentElement[?Yield, ?Await]
601
602AssignmentProperty[Yield, Await] :
603  IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
604  PropertyName[?Yield, ?Await] `:` AssignmentElement[?Yield, ?Await]
605
606AssignmentElement[Yield, Await] :
607  DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
608
609AssignmentRestElement[Yield, Await] :
610  `...` DestructuringAssignmentTarget[?Yield, ?Await]
611
612DestructuringAssignmentTarget[Yield, Await] :
613  LeftHandSideExpression[?Yield, ?Await]
614
615
616@returns Expression
617Expression[In, Yield, Await] :
618  AssignmentExpression[?In, ?Yield, ?Await]
619    => $0
620  Expression[?In, ?Yield, ?Await] `,` AssignmentExpression[?In, ?Yield, ?Await]
621    => binary_expr(comma_op($1), $0, $2)
622
623
624@returns Statement
625Statement[Yield, Await, Return] :
626  BlockStatement[?Yield, ?Await, ?Return]
627    => $0
628  VariableStatement[?Yield, ?Await]
629    => $0
630  EmptyStatement
631    => $0
632  ExpressionStatement[?Yield, ?Await]
633    => $0
634  IfStatement[?Yield, ?Await, ?Return]
635    => $0
636  BreakableStatement[?Yield, ?Await, ?Return]
637    => $0
638  ContinueStatement[?Yield, ?Await]
639    => $0
640  BreakStatement[?Yield, ?Await]
641    => $0
642  [+Return] ReturnStatement[?Yield, ?Await]
643    => $0
644  WithStatement[?Yield, ?Await, ?Return]
645    => $0
646  LabelledStatement[?Yield, ?Await, ?Return]
647    => $0
648  ThrowStatement[?Yield, ?Await]
649    => $0
650  TryStatement[?Yield, ?Await, ?Return]
651    => $0
652  DebuggerStatement
653    => $0
654
655@returns Statement
656Declaration[Yield, Await] :
657  HoistableDeclaration[?Yield, ?Await, ~Default]
658    => $0
659  ClassDeclaration[?Yield, ?Await, ~Default]
660    => $0
661  LexicalDeclaration[+In, ?Yield, ?Await]
662    => $0
663
664@returns Statement
665HoistableDeclaration[Yield, Await, Default] :
666  FunctionDeclaration[?Yield, ?Await, ?Default]
667    => $0
668  GeneratorDeclaration[?Yield, ?Await, ?Default]
669    => $0
670  AsyncFunctionDeclaration[?Yield, ?Await, ?Default]
671    => $0
672  AsyncGeneratorDeclaration[?Yield, ?Await, ?Default]
673    => $0
674
675@returns Statement
676BreakableStatement[Yield, Await, Return] :
677  IterationStatement[?Yield, ?Await, ?Return]
678    => $0
679  SwitchStatement[?Yield, ?Await, ?Return]
680    => $0
681
682
683@returns Statement
684BlockStatement[Yield, Await, Return] :
685  Block[?Yield, ?Await, ?Return]
686    => block_statement($0)
687
688@returns Block
689Block[Yield, Await, Return] :
690  `{` StatementList[?Yield, ?Await, ?Return]? `}`
691    => block($0, $1, $2)
692
693@returns Vec<Statement>
694StatementList[Yield, Await, Return] :
695  StatementListItem[?Yield, ?Await, ?Return]
696    => statement_list_single($0)
697  StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return]
698    => statement_list_append($0, $1)
699
700@returns Statement
701StatementListItem[Yield, Await, Return] :
702  Statement[?Yield, ?Await, ?Return]
703    => $0
704  Declaration[?Yield, ?Await]
705    => $0
706
707
708@returns Statement
709LexicalDeclaration[In, Yield, Await] :
710  LetOrConst BindingList[?In, ?Yield, ?Await] `;`
711    => lexical_declaration($0, $1)
712
713@returns VariableDeclarationOrExpression
714ForLexicalDeclaration[In, Yield, Await] :
715  LetOrConst BindingList[?In, ?Yield, ?Await] `;`
716    => for_lexical_declaration($0, $1)
717
718@returns VariableDeclarationKind
719LetOrConst :
720  `let`
721    => let_kind($0)
722  `const`
723    => const_kind($0)
724
725@returns Vec<VariableDeclarator>
726BindingList[In, Yield, Await] :
727  LexicalBinding[?In, ?Yield, ?Await]
728    => variable_declaration_list_single($0)
729  BindingList[?In, ?Yield, ?Await] `,` LexicalBinding[?In, ?Yield, ?Await]
730    => variable_declaration_list_append($0, $2)
731
732@returns VariableDeclarator
733LexicalBinding[In, Yield, Await] :
734  BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]?
735    => variable_declaration(binding_identifier_to_binding($0), $1)
736  BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
737    => variable_declaration($0, Some($1))
738
739
740@returns Statement
741VariableStatement[Yield, Await] :
742  `var` VariableDeclarationList[+In, ?Yield, ?Await] `;`
743    => variable_statement($0, $1)
744
745@returns Vec<VariableDeclarator>
746VariableDeclarationList[In, Yield, Await] :
747  VariableDeclaration[?In, ?Yield, ?Await]
748    => variable_declaration_list_single($0)
749  VariableDeclarationList[?In, ?Yield, ?Await] `,` VariableDeclaration[?In, ?Yield, ?Await]
750    => variable_declaration_list_append($0, $2)
751
752@returns VariableDeclarator
753VariableDeclaration[In, Yield, Await] :
754  BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]?
755    => variable_declaration(binding_identifier_to_binding($0), $1)
756  BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
757    => variable_declaration($0, Some($1))
758
759
760@returns Binding
761BindingPattern[Yield, Await] :
762  ObjectBindingPattern[?Yield, ?Await]
763    => $0
764  ArrayBindingPattern[?Yield, ?Await]
765    => $0
766
767@returns Binding
768ObjectBindingPattern[Yield, Await] :
769  `{` `}`
770    => object_binding_pattern($0, binding_property_list_empty(), None, $1)
771  `{` BindingRestProperty[?Yield, ?Await] `}`
772    => object_binding_pattern($0, binding_property_list_empty(), Some($1), $2)
773  `{` BindingPropertyList[?Yield, ?Await] `}`
774    => object_binding_pattern($0, $1, None, $2)
775  `{` BindingPropertyList[?Yield, ?Await] `,` BindingRestProperty[?Yield, ?Await]? `}`
776    => object_binding_pattern($0, $1, $3, $4)
777
778@returns Binding
779ArrayBindingPattern[Yield, Await] :
780  `[` Elision? BindingRestElement[?Yield, ?Await]? `]`
781    => array_binding_pattern($0, binding_element_list_empty(), $1, $2, $3)
782  `[` BindingElementList[?Yield, ?Await] `]`
783    => array_binding_pattern($0, $1, None, None, $2)
784  `[` BindingElementList[?Yield, ?Await] `,` Elision? BindingRestElement[?Yield, ?Await]? `]`
785    => array_binding_pattern($0, $1, $3, $4, $5)
786
787@returns BindingIdentifier
788BindingRestProperty[Yield, Await] :
789  `...` BindingIdentifier[?Yield, ?Await]
790    => $1
791
792@returns Vec<BindingProperty>
793BindingPropertyList[Yield, Await] :
794  BindingProperty[?Yield, ?Await]
795    => binding_property_list_single($0)
796  BindingPropertyList[?Yield, ?Await] `,` BindingProperty[?Yield, ?Await]
797    => binding_property_list_append($0, $2)
798
799@returns Vec<Option<Parameter>>
800BindingElementList[Yield, Await] :
801  BindingElisionElement[?Yield, ?Await]
802    => $0
803  BindingElementList[?Yield, ?Await] `,` BindingElisionElement[?Yield, ?Await]
804    => binding_element_list_append($0, $2)
805
806@returns Vec<Option<Parameter>>
807BindingElisionElement[Yield, Await] :
808  Elision? BindingElement[?Yield, ?Await]
809   => binding_elision_element($0, $1)
810
811@returns BindingProperty
812BindingProperty[Yield, Await] :
813  SingleNameBinding[?Yield, ?Await]
814    => binding_property_shorthand($0)
815  PropertyName[?Yield, ?Await] `:` BindingElement[?Yield, ?Await]
816    => binding_property($0, $2)
817
818@returns Parameter
819BindingElement[Yield, Await] :
820  SingleNameBinding[?Yield, ?Await]
821    => $0
822  BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
823    => binding_element_pattern($0, $1)
824
825@returns Parameter
826SingleNameBinding[Yield, Await] :
827  BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
828    => single_name_binding($0, $1)
829
830@returns Binding
831BindingRestElement[Yield, Await] :
832  `...` BindingIdentifier[?Yield, ?Await]
833    => binding_identifier_to_binding($1)
834  `...` BindingPattern[?Yield, ?Await]
835    => $1
836
837
838@returns Statement
839EmptyStatement :
840  `;`
841    => empty_statement($0)
842
843@returns Statement
844ExpressionStatement[Yield, Await] :
845  [lookahead <! {`{`, `function`, `async`, `class`, `let`}] Expression[+In, ?Yield, ?Await] `;`
846    => expression_statement($0)
847
848
849@returns Statement
850IfStatement[Yield, Await, Return] :
851  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` Statement[?Yield, ?Await, ?Return]
852    => if_statement($0, $2, $4, Some($6))
853  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] [lookahead != `else`]
854    => if_statement($0, $2, $4, None)
855  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` Statement[?Yield, ?Await, ?Return]
856    => if_statement($0, $2, make_block_stmt_from_function_decl($4), Some($6))
857  `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` FunctionDeclaration[?Yield, ?Await, ~Default]
858    => if_statement($0, $2, $4, Some(make_block_stmt_from_function_decl($6)))
859  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` FunctionDeclaration[?Yield, ?Await, ~Default]
860    => if_statement($0, $2, make_block_stmt_from_function_decl($4), Some(make_block_stmt_from_function_decl($6)))
861  `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] [lookahead != `else`]
862    => if_statement($0, $2, make_block_stmt_from_function_decl($4), None)
863
864
865@returns Statement
866IterationStatement[Yield, Await, Return] :
867  `do` Statement[?Yield, ?Await, ?Return] `while` `(` Expression[+In, ?Yield, ?Await] `)` `;`
868    => do_while_statement($0, $1, $4, $5)
869  `while` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
870    => while_statement($0, $2, $4)
871  `for` `(` [lookahead != `let`] Expression[~In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
872    => for_statement($0, for_expression($2), $4, $6, $8)
873  `for` `(` `var` VariableDeclarationList[~In, ?Yield, ?Await] `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
874    => for_statement($0, Some(for_var_declaration($2, $3)), $5, $7, $9)
875  `for` `(` ForLexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
876    => for_statement_lexical($0, unbox_for_lexical_declaration($2), $3, $5, $7)
877  `for` `(` [lookahead != `let`] LeftHandSideExpression[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
878    => for_in_statement($0, for_assignment_target($2), $4, $6)
879  `for` `(` `var` ForBinding[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
880    => for_in_statement($0, for_in_or_of_var_declaration($2, $3, None), $5, $7)
881  `for` `(` `var` BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
882    => for_in_statement($0, for_in_or_of_var_declaration($2, binding_identifier_to_binding($3), Some($4)), $6, $8)
883  `for` `(` ForDeclaration[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
884    => for_in_statement_lexical($0, unbox_for_declaration($2), $4, $6)
885  `for` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
886    => for_of_statement($0, for_assignment_target($2), $4, $6)
887  `for` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
888    => for_of_statement($0, for_in_or_of_var_declaration($2, $3, None), $5, $7)
889  `for` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
890    => for_of_statement_lexical($0, unbox_for_declaration($2), $4, $6)
891  [+Await] `for` `await` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
892    => for_await_of_statement($0, for_assignment_target($3), $5, $7)
893  [+Await] `for` `await` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
894    => for_await_of_statement($0, for_in_or_of_var_declaration($3, $4, None), $6, $8)
895  [+Await] `for` `await` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
896    => for_await_of_statement_lexical($0, unbox_for_declaration($3), $5, $7)
897
898@returns VariableDeclarationOrAssignmentTarget
899ForDeclaration[Yield, Await] :
900  LetOrConst ForBinding[?Yield, ?Await]
901    => for_declaration($0, $1)
902
903@returns Binding
904ForBinding[Yield, Await] :
905  BindingIdentifier[?Yield, ?Await]
906    => binding_identifier_to_binding($0)
907  BindingPattern[?Yield, ?Await]
908    => $0
909
910
911@returns Statement
912ContinueStatement[Yield, Await] :
913  `continue` `;`
914    => continue_statement($0, None)
915  `continue` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;`
916    => continue_statement($0, Some($1))
917
918
919@returns Statement
920BreakStatement[Yield, Await] :
921  `break` `;`
922    => break_statement($0, None)
923  `break` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;`
924    => break_statement($0, Some($1))
925
926
927@returns Statement
928ReturnStatement[Yield, Await] :
929  `return` `;`
930    => return_statement($0, None)
931  `return` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;`
932    => return_statement($0, Some($1))
933
934
935@returns Statement
936WithStatement[Yield, Await, Return] :
937  `with` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
938    => with_statement($0, $2, $4)
939
940
941@returns Statement
942SwitchStatement[Yield, Await, Return] :
943  `switch` `(` Expression[+In, ?Yield, ?Await] `)` CaseBlock[?Yield, ?Await, ?Return]
944    => switch_statement($0, $2, $4)
945
946@returns Statement
947CaseBlock[Yield, Await, Return] :
948  `{` CaseClauses[?Yield, ?Await, ?Return]? `}`
949    => case_block($0, $1, $2)
950  `{` CaseClauses[?Yield, ?Await, ?Return]? DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]? `}`
951    => case_block_with_default($0, $1, $2, $3, $4)
952
953@returns Vec<SwitchCase>
954CaseClauses[Yield, Await, Return] :
955  CaseClause[?Yield, ?Await, ?Return]
956    => case_clauses_single($0)
957  CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return]
958    => case_clauses_append($0, $1)
959
960@returns SwitchCase
961CaseClause[Yield, Await, Return] :
962  `case` Expression[+In, ?Yield, ?Await] `:` StatementList[?Yield, ?Await, ?Return]?
963    => case_clause($0, $1, $2, $3)
964
965@returns SwitchDefault
966DefaultClause[Yield, Await, Return] :
967  `default` `:` StatementList[?Yield, ?Await, ?Return]?
968    => default_clause($0, $1, $2)
969
970
971@returns Statement
972LabelledStatement[Yield, Await, Return] :
973  LabelIdentifier[?Yield, ?Await] `:` LabelledItem[?Yield, ?Await, ?Return]
974    => labelled_statement($0, $2)
975
976@returns Statement
977LabelledItem[Yield, Await, Return] :
978  Statement[?Yield, ?Await, ?Return]
979    => $0
980  FunctionDeclaration[?Yield, ?Await, ~Default]
981    => $0
982
983
984@returns Statement
985ThrowStatement[Yield, Await] :
986  `throw` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;`
987    => throw_statement($0, $1)
988
989@returns Statement
990TryStatement[Yield, Await, Return] :
991  `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return]
992    => try_statement($0, $1, Some($2), None)
993  `try` Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
994    =>  try_statement($0, $1, None, Some($2))
995  `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
996    => try_statement($0, $1, Some($2), Some($3))
997
998@returns CatchClause
999Catch[Yield, Await, Return] :
1000  `catch` `(` CatchParameter[?Yield, ?Await] `)` CatchBlock[?Yield, ?Await, ?Return]
1001    => catch($0, $2, $4)
1002  `catch` Block[?Yield, ?Await, ?Return]
1003    => catch_no_param($0, $1)
1004
1005@returns Block
1006CatchBlock[Yield, Await, Return] :
1007  `{` StatementList[?Yield, ?Await, ?Return]? `}`
1008    => catch_block($0, $1, $2)
1009
1010@returns Block
1011Finally[Yield, Await, Return] :
1012  `finally` Block[?Yield, ?Await, ?Return]
1013    => $1
1014
1015@returns Binding
1016CatchParameter[Yield, Await] :
1017  BindingIdentifier[?Yield, ?Await]
1018    => binding_identifier_to_binding($0)
1019  BindingPattern[?Yield, ?Await]
1020    => $0
1021
1022
1023@returns Statement
1024DebuggerStatement :
1025  `debugger` `;`
1026    => debugger_statement($0)
1027
1028
1029@returns Statement
1030FunctionDeclaration[Yield, Await, Default] :
1031  `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1032    => function_decl(function($0, Some($1), $2, $3, $4, $5, $6, $7))
1033  [+Default] `function` `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1034    => function_decl(function($0, None, $1, $2, $3, $4, $5, $6))
1035
1036@returns Expression
1037FunctionExpression :
1038  `function` BindingIdentifier[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1039    => function_expr(function($0, $1, $2, $3, $4, $5, $6, $7))
1040
1041@returns FormalParameters
1042UniqueFormalParameters[Yield, Await] :
1043  FormalParameters[?Yield, ?Await]
1044    => unique_formal_parameters($0)
1045
1046@returns FormalParameters
1047FormalParameters[Yield, Await] :
1048  [empty]
1049    => empty_formal_parameters()
1050  FunctionRestParameter[?Yield, ?Await]
1051    => with_rest_parameter(empty_formal_parameters(), $0)
1052  FormalParameterList[?Yield, ?Await]
1053    => $0
1054  FormalParameterList[?Yield, ?Await] `,`
1055    => $0
1056  FormalParameterList[?Yield, ?Await] `,` FunctionRestParameter[?Yield, ?Await]
1057    => with_rest_parameter($0, $2)
1058
1059@returns FormalParameters
1060FormalParameterList[Yield, Await] :
1061  FormalParameter[?Yield, ?Await]
1062    => formal_parameter_list_single($0)
1063  FormalParameterList[?Yield, ?Await] `,` FormalParameter[?Yield, ?Await]
1064    => formal_parameter_list_append($0, $2)
1065
1066@returns Binding
1067FunctionRestParameter[Yield, Await] :
1068  BindingRestElement[?Yield, ?Await]
1069    => $0
1070
1071@returns Parameter
1072FormalParameter[Yield, Await] :
1073  BindingElement[?Yield, ?Await]
1074    => $0
1075
1076@returns FunctionBody
1077FunctionBody[Yield, Await] :
1078  FunctionStatementList[?Yield, ?Await]
1079    => function_body($0)
1080
1081@returns Vec<Statement>
1082FunctionStatementList[Yield, Await] :
1083  StatementList[?Yield, ?Await, +Return]?
1084    => function_statement_list($0)
1085
1086
1087@returns Expression
1088ArrowFunction[In, Yield, Await] :
1089  ArrowParameters[?Yield, ?Await] [no LineTerminator here] `=>` ConciseBody[?In]
1090    => arrow_function($0, $2)
1091
1092@returns FormalParameters
1093ArrowParameters[Yield, Await] :
1094  BindingIdentifier[?Yield, ?Await]
1095    => arrow_parameters_bare($0)
1096  CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
1097    => uncover_arrow_parameters($0)
1098
1099@returns ArrowExpressionBody
1100ConciseBody[In] :
1101  [lookahead != `{` ] AssignmentExpression[?In, ~Yield, ~Await]
1102    => concise_body_expression($0)
1103  `{` FunctionBody[~Yield, ~Await] `}`
1104    => concise_body_block($0, $1, $2)
1105
1106
1107ArrowFormalParameters[Yield, Await] :
1108  `(` UniqueFormalParameters[?Yield, ?Await] `)`
1109
1110
1111@returns MethodDefinition
1112MethodDefinition[Yield, Await] :
1113  ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1114    => method_definition($0, $1, $2, $3, $4, $5, $6)
1115  GeneratorMethod[?Yield, ?Await]
1116    => $0
1117  AsyncMethod[?Yield, ?Await]
1118    => $0
1119  AsyncGeneratorMethod[?Yield, ?Await]
1120    => $0
1121  `get` ClassElementName[?Yield, ?Await] `(` `)` `{` FunctionBody[~Yield, ~Await] `}`
1122    => getter($0, $1, $4, $5, $6)
1123  `set` ClassElementName[?Yield, ?Await] `(` PropertySetParameterList `)` `{` FunctionBody[~Yield, ~Await] `}`
1124    => setter($0, $1, $2, $3, $4, $5, $6, $7)
1125
1126@returns Parameter
1127PropertySetParameterList :
1128  FormalParameter[~Yield, ~Await]
1129    => $0
1130
1131
1132@returns MethodDefinition
1133GeneratorMethod[Yield, Await] :
1134  `*` ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1135    => generator_method($0, $1, $2, $3, $4, $5, $6, $7)
1136
1137@returns Statement
1138GeneratorDeclaration[Yield, Await, Default] :
1139  `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1140    => function_decl(generator($0, Some($2), $3, $4, $5, $6, $7, $8))
1141  [+Default] `function` `*` `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1142    => function_decl(generator($0, None, $2, $3, $4, $5, $6, $7))
1143
1144@returns Expression
1145GeneratorExpression :
1146  `function` `*` BindingIdentifier[+Yield, ~Await]? `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1147    => function_expr(generator($0, $2, $3, $4, $5, $6, $7, $8))
1148
1149@returns FunctionBody
1150GeneratorBody :
1151  FunctionBody[+Yield, ~Await]
1152    => $0
1153
1154@returns Expression
1155YieldExpression[In, Await] :
1156  `yield`
1157    => yield_expr($0, None)
1158  `yield` [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await]
1159    => yield_expr($0, Some($1))
1160  `yield` [no LineTerminator here] `*` AssignmentExpression[?In, +Yield, ?Await]
1161    => yield_star_expr($0, $2)
1162
1163
1164@returns MethodDefinition
1165AsyncGeneratorMethod[Yield, Await] :
1166  `async` [no LineTerminator here] `*` ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1167    => async_generator_method($0, $2, $3, $4, $5, $6, $7, $8)
1168
1169@returns Statement
1170AsyncGeneratorDeclaration[Yield, Await, Default] :
1171  `async` [no LineTerminator here] `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1172    => function_decl(async_generator($0, Some($3), $4, $5, $6, $7, $8, $9))
1173  [+Default] `async` [no LineTerminator here] `function` `*` `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1174    => function_decl(async_generator($0, None, $3, $4, $5, $6, $7, $8))
1175
1176@returns Expression
1177AsyncGeneratorExpression :
1178  `async` [no LineTerminator here] `function` `*` BindingIdentifier[+Yield, +Await]? `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
1179    => function_expr(async_function($0, $3, $4, $5, $6, $7, $8, $9))
1180
1181@returns FunctionBody
1182AsyncGeneratorBody :
1183  FunctionBody[+Yield, +Await]
1184    => $0
1185
1186
1187@returns Statement
1188ClassDeclaration[Yield, Await, Default] :
1189  `class` BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
1190    => class_declaration($0, Some($1), $2)
1191  [+Default] `class` ClassTail[?Yield, ?Await]
1192    => class_declaration($0, None, $1)
1193
1194@returns Expression
1195ClassExpression[Yield, Await] :
1196  `class` BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await]
1197    => class_expression($0, $1, $2)
1198
1199@returns ClassExpression
1200ClassTail[Yield, Await] :
1201  ClassHeritage[?Yield, ?Await]? `{` ClassBody[?Yield, ?Await]? `}`
1202    => class_tail($0, $2, $3)
1203
1204@returns Expression
1205ClassHeritage[Yield, Await] :
1206  `extends` LeftHandSideExpression[?Yield, ?Await]
1207    => $1
1208
1209@returns Vec<Box<ClassElement>>
1210ClassBody[Yield, Await] :
1211  ClassElementList[?Yield, ?Await]
1212    => $0
1213
1214@returns Vec<Box<ClassElement>>
1215ClassElementList[Yield, Await] :
1216  ClassElement[?Yield, ?Await]
1217    => $0
1218  ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await]
1219    => class_element_list_append($0, $1)
1220
1221@returns ClassElement
1222FieldDefinition[Yield, Await] :
1223  ClassElementName[?Yield, ?Await] Initializer[+In, ~Yield, ~Await]?
1224    => class_field_definition($0, $1)
1225
1226@returns ClassElementName
1227ClassElementName[Yield, Await] :
1228  PropertyName[?Yield, ?Await]
1229    => property_name_to_class_element_name($0)
1230  PrivateIdentifier
1231    => class_element_name_private($0)
1232
1233@returns Vec<Box<ClassElement>>
1234ClassElement[Yield, Await] :
1235  MethodDefinition[?Yield, ?Await]
1236    => class_element($0)
1237  `static` MethodDefinition[?Yield, ?Await]
1238    => class_element_static($0, $1)
1239  FieldDefinition[?Yield, ?Await] `;`
1240    => class_element_to_vec($0)
1241  `static` FieldDefinition[?Yield, ?Await] `;`
1242    => class_element_static_field($0, $1)
1243  `;`
1244    => class_element_empty()
1245
1246
1247@returns Statement
1248AsyncFunctionDeclaration[Yield, Await, Default] :
1249  `async` [no LineTerminator here] `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1250    => function_decl(async_function($0, Some($2), $3, $4, $5, $6, $7, $8))
1251  [+Default] `async` [no LineTerminator here] `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1252    => function_decl(async_function($0, None, $2, $3, $4, $5, $6, $7))
1253
1254@returns Expression
1255AsyncFunctionExpression :
1256  `async` [no LineTerminator here] `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1257    => function_expr(async_function($0, None, $2, $3, $4, $5, $6, $7))
1258  `async` [no LineTerminator here] `function` BindingIdentifier[~Yield, +Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1259    => function_expr(async_function($0, Some($2), $3, $4, $5, $6, $7, $8))
1260
1261@returns MethodDefinition
1262AsyncMethod[Yield, Await] :
1263  `async` [no LineTerminator here] PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
1264    => async_method($0, $1, $2, $3, $4, $5, $6, $7)
1265
1266@returns FunctionBody
1267AsyncFunctionBody :
1268  FunctionBody[~Yield, +Await]
1269    => $0
1270
1271@returns Expression
1272AwaitExpression[Yield] :
1273  `await` UnaryExpression[?Yield, +Await]
1274    => await_expr($0, $1)
1275
1276
1277@returns Expression
1278AsyncArrowFunction[In, Yield, Await] :
1279  `async` [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] `=>` AsyncConciseBody[?In]
1280    => async_arrow_function_bare($0, $1, $3)
1281  CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] `=>` AsyncConciseBody[?In]
1282    => async_arrow_function($0, $2)
1283
1284@returns ArrowExpressionBody
1285AsyncConciseBody[In] :
1286  [lookahead != `{`] AssignmentExpression[?In, ~Yield, +Await]
1287    => concise_body_expression($0)
1288  `{` AsyncFunctionBody `}`
1289    => concise_body_block($0, $1, $2)
1290
1291@returns BindingIdentifier
1292AsyncArrowBindingIdentifier[Yield] :
1293  BindingIdentifier[?Yield, +Await]
1294    => $0
1295
1296@returns Expression
1297CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
1298  MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
1299    => call_expr($0, $1)
1300
1301
1302AsyncArrowHead :
1303  `async` [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
1304
1305
1306@returns Script
1307Script :
1308  ScriptBody?
1309    => script($0)
1310
1311@returns Script
1312ScriptBody :
1313  StatementList[~Yield, ~Await, ~Return]
1314    => script_body($0)
1315
1316@returns Vec<Statement>
1317Module :
1318  ModuleBody?
1319    => module($0)
1320
1321@returns Vec<Statement>
1322ModuleBody :
1323  ModuleItemList
1324    => $0
1325
1326@returns Vec<Statement>
1327ModuleItemList :
1328  ModuleItem
1329    => module_item_list_single($0)
1330  ModuleItemList ModuleItem
1331    => module_item_list_append($0, $1)
1332
1333@returns Statement
1334ModuleItem :
1335  ImportDeclaration
1336    => $0
1337  ExportDeclaration
1338    => $0
1339  StatementListItem[~Yield, ~Await, ~Return]
1340    => $0
1341
1342
1343@returns Statement
1344ImportDeclaration :
1345  `import` ImportClause FromClause `;`
1346    => import_declaration(Some($1), $2)
1347  `import` ModuleSpecifier `;`
1348    => import_declaration(None, $1)
1349
1350@returns Void
1351ImportClause :
1352  ImportedDefaultBinding
1353    => import_clause(Some($0), None, None)
1354  NameSpaceImport
1355    => import_clause(None, Some($0), None)
1356  NamedImports
1357    => import_clause(None, None, Some($0))
1358  ImportedDefaultBinding `,` NameSpaceImport
1359    => import_clause(Some($0), Some($2), None)
1360  ImportedDefaultBinding `,` NamedImports
1361    => import_clause(Some($0), None, Some($2))
1362
1363@returns BindingIdentifier
1364ImportedDefaultBinding :
1365  ImportedBinding
1366    => $0
1367
1368@returns Void
1369NameSpaceImport :
1370  `*` `as` ImportedBinding
1371    => name_space_import($2)
1372
1373@returns Void
1374NamedImports :
1375  `{` `}`
1376    => imports_list_empty()
1377  `{` ImportsList `}`
1378    => $1
1379  `{` ImportsList `,` `}`
1380    => $1
1381
1382@returns Token
1383FromClause :
1384  `from` ModuleSpecifier
1385    => $1
1386
1387@returns Void
1388ImportsList :
1389  ImportSpecifier
1390    => imports_list_append(imports_list_empty(), $0)
1391  ImportsList `,` ImportSpecifier
1392    => imports_list_append($0, $2)
1393
1394@returns Void
1395ImportSpecifier :
1396  ImportedBinding
1397    => import_specifier($0)
1398  IdentifierName `as` ImportedBinding
1399    => import_specifier_renaming($0, $2)
1400
1401@returns Token
1402ModuleSpecifier :
1403  StringLiteral
1404    => module_specifier($0)
1405
1406@returns BindingIdentifier
1407ImportedBinding :
1408  BindingIdentifier[~Yield, ~Await]
1409    => $0
1410
1411
1412@returns Statement
1413ExportDeclaration :
1414  `export` `*` FromClause `;`
1415    => export_all_from($2)
1416  `export` ExportClause FromClause `;`
1417    => export_set_from($1, $2)
1418  `export` ExportClause `;`
1419    => export_set($1)
1420  `export` VariableStatement[~Yield, ~Await]
1421    => export_vars($1)
1422  `export` Declaration[~Yield, ~Await]
1423    => export_declaration($1)
1424  `export` `default` HoistableDeclaration[~Yield, ~Await, +Default]
1425    => export_default_hoistable($2)
1426  `export` `default` ClassDeclaration[~Yield, ~Await, +Default]
1427    => export_default_class($2)
1428  `export` `default` [lookahead <! {`function`, `async`, `class`}] AssignmentExpression[+In, ~Yield, ~Await] `;`
1429    => export_default_value($2)
1430
1431@returns Void
1432ExportClause :
1433  `{` `}`
1434    => exports_list_empty()
1435  `{` ExportsList `}`
1436    => $1
1437  `{` ExportsList `,` `}`
1438    => $1
1439
1440@returns Void
1441ExportsList :
1442  ExportSpecifier
1443    => exports_list_append(exports_list_empty(), $0)
1444  ExportsList `,` ExportSpecifier
1445    => exports_list_append($0, $2)
1446
1447@returns Void
1448ExportSpecifier :
1449  IdentifierName
1450    => export_specifier($0)
1451  IdentifierName `as` IdentifierName
1452    => export_specifier_renaming($0, $2)
1453
1454