Bug 1888590 - Mark some subtests on trusted-types-event-handlers.html as failing...
[gecko.git] / third_party / rust / jsparagus / js_parser / es-simplified.esgrammar
blobf7ebbb20174157edfd42610d441879b4d436e00b
1 @returns Identifier
2 IdentifierReference[Yield, Await] :
3   Identifier
4     => identifier_reference($0)
6 @returns BindingIdentifier
7 BindingIdentifier[Yield, Await] :
8   Identifier
9     => binding_identifier($0)
10   `yield`
11     => binding_identifier_yield($0)
12   `await`
13     => binding_identifier_await($0)
15 @returns Label
16 LabelIdentifier[Yield, Await] :
17   Identifier
18     => label_identifier($0)
20 @returns Expression
21 PrimaryExpression[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)
49 @returns CoverParenthesized
50 CoverParenthesizedExpressionAndArrowParameterList[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)
67 @returns Expression
68 Literal :
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)
81 @returns Expression
82 ArrayLiteral[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)
90 @returns ArrayExpression
91 ElementList[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)
101 @returns ArrayExpression
102 Elision :
103   `,`
104     => elision_single($0)
105   Elision `,`
106     => elision_append($0, $1)
108 @returns Expression
109 SpreadElement[Yield, Await] :
110   `...` AssignmentExpression[+In, ?Yield, ?Await]
111     => spread_element($1)
114 @returns Expression
115 ObjectLiteral[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)
123 @returns ObjectExpression
124 PropertyDefinitionList[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)
130 @returns ObjectProperty
131 PropertyDefinition[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)
143 @returns PropertyName
144 PropertyName[Yield, Await] :
145   LiteralPropertyName
146     => $0
147   ComputedPropertyName[?Yield, ?Await]
148     => $0
150 @returns PropertyName
151 LiteralPropertyName :
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)
161 @returns PropertyName
162 ComputedPropertyName[Yield, Await] :
163   `[` AssignmentExpression[+In, ?Yield, ?Await] `]`
164     => computed_property_name($0, $1, $2)
166 @returns ObjectProperty
167 CoverInitializedName[Yield, Await] :
168   IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
169     => cover_initialized_name($0, $1)
171 @returns Expression
172 Initializer[In, Yield, Await] :
173   `=` AssignmentExpression[?In, ?Yield, ?Await]
174     => $1
177 @returns TemplateExpression
178 TemplateLiteral[Yield, Await, Tagged] :
179   NoSubstitutionTemplate
180     => template_literal($0)
181   SubstitutionTemplate[?Yield, ?Await, ?Tagged]
182     => $0
184 @returns TemplateExpression
185 SubstitutionTemplate[Yield, Await, Tagged] :
186   TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
187     => substitution_template($0, $1, $2)
189 @returns Void
190 TemplateSpans[Yield, Await, Tagged] :
191   TemplateTail
192     => template_spans(None, $0)
193   TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail
194     => template_spans(Some($0), $1)
196 @returns Void
197 TemplateMiddleList[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)
203 @returns Expression
204 MemberExpression[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)
222 @returns Expression
223 SuperProperty[Yield, Await] :
224   `super` `[` Expression[+In, ?Yield, ?Await] `]`
225     => super_property_computed($0, $2, $3)
226   `super` `.` IdentifierName
227     => super_property_static($0, $2)
229 @returns Expression
230 MetaProperty :
231   NewTarget
232     => $0
234 @returns Expression
235 NewTarget :
236   `new` `.` `target`
237     => new_target_expr($0, $2)
239 @returns Expression
240 NewExpression[Yield, Await] :
241   MemberExpression[?Yield, ?Await]
242     => $0
243   `new` NewExpression[?Yield, ?Await]
244     => new_expr_without_arguments($0, $1)
246 @returns Expression
247 CallExpression[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)
265 @returns Expression
266 SuperCall[Yield, Await] :
267   `super` Arguments[?Yield, ?Await]
268     => super_call($0, $1)
270 @returns Expression
271 ImportCall[Yield, Await] :
272   `import` `(` AssignmentExpression[+In, ?Yield, ?Await] `)`
273     => import_call($0, $2, $3)
275 @returns Arguments
276 Arguments[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)
284 @returns Arguments
285 ArgumentList[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)
295 @returns Expression
296 OptionalExpression[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)
304 @returns Expression
305 OptionalChain[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()
327 @returns Expression
328 LeftHandSideExpression[Yield, Await] :
329   NewExpression[?Yield, ?Await]
330     => $0
331   CallExpression[?Yield, ?Await]
332     => $0
333   OptionalExpression[?Yield, ?Await]
334     => $0
337 @returns Expression
338 CallMemberExpression[Yield, Await] :
339   MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
340     => call_expr($0, $1)
343 @returns Expression
344 UpdateExpression[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)
357 @returns Expression
358 UnaryExpression[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
379 @returns Expression
380 ExponentiationExpression[Yield, Await] :
381   UnaryExpression[?Yield, ?Await]
382     => $0
383   UpdateExpression[?Yield, ?Await] `**` ExponentiationExpression[?Yield, ?Await]
384     => binary_expr(pow_op($1), $0, $2)
387 @returns Expression
388 MultiplicativeExpression[Yield, Await] :
389   ExponentiationExpression[?Yield, ?Await]
390     => $0
391   MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await]
392     => multiplicative_expr($0, $1, $2)
394 @returns BinaryOperator
395 MultiplicativeOperator :
396   `*`
397     => box_op(mul_op($0))
398   `/`
399     => box_op(div_op($0))
400   `%`
401     => box_op(mod_op($0))
404 @returns Expression
405 AdditiveExpression[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)
414 @returns Expression
415 ShiftExpression[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)
426 @returns Expression
427 RelationalExpression[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)
444 @returns Expression
445 EqualityExpression[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)
458 @returns Expression
459 BitwiseANDExpression[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)
465 @returns Expression
466 BitwiseXORExpression[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)
472 @returns Expression
473 BitwiseORExpression[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)
479 @returns Expression
480 LogicalANDExpression[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)
486 @returns Expression
487 LogicalORExpression[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)
493 @returns Expression
494 ShortCircuitExpression[In, Yield, Await] :
495   LogicalORExpression[?In, ?Yield, ?Await]
496     => $0
497   CoalesceExpression[?In, ?Yield, ?Await]
498     => $0
500 @returns Expression
501 CoalesceExpression[In, Yield, Await] :
502   CoalesceExpressionHead[?In, ?Yield, ?Await] `??` BitwiseORExpression[?In, ?Yield, ?Await]
503     => binary_expr(coalesce_op($1), $0, $2)
505 @returns Expression
506 CoalesceExpressionHead[In, Yield, Await] :
507   CoalesceExpression[?In, ?Yield, ?Await]
508     => $0
509   BitwiseORExpression[?In, ?Yield, ?Await]
510     => $0
512 @returns Expression
513 ConditionalExpression[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)
520 @returns Expression
521 AssignmentExpression[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)
537 @returns CompoundAssignmentOperator
538 AssignmentOperator :
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))
564 @returns CompoundAssignmentOperator
565 LogicalAssignmentOperator :
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))
573 AssignmentPattern[Yield, Await] :
574   ObjectAssignmentPattern[?Yield, ?Await]
575   ArrayAssignmentPattern[?Yield, ?Await]
577 ObjectAssignmentPattern[Yield, Await] :
578   `{` `}`
579   `{` AssignmentRestProperty[?Yield, ?Await] `}`
580   `{` AssignmentPropertyList[?Yield, ?Await] `}`
581   `{` AssignmentPropertyList[?Yield, ?Await] `,` AssignmentRestProperty[?Yield, ?Await]? `}`
583 ArrayAssignmentPattern[Yield, Await] :
584   `[` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
585   `[` AssignmentElementList[?Yield, ?Await] `]`
586   `[` AssignmentElementList[?Yield, ?Await] `,` Elision? AssignmentRestElement[?Yield, ?Await]? `]`
588 AssignmentRestProperty[Yield, Await] :
589   `...` DestructuringAssignmentTarget[?Yield, ?Await]
591 AssignmentPropertyList[Yield, Await] :
592   AssignmentProperty[?Yield, ?Await]
593   AssignmentPropertyList[?Yield, ?Await] `,` AssignmentProperty[?Yield, ?Await]
595 AssignmentElementList[Yield, Await] :
596   AssignmentElisionElement[?Yield, ?Await]
597   AssignmentElementList[?Yield, ?Await] `,` AssignmentElisionElement[?Yield, ?Await]
599 AssignmentElisionElement[Yield, Await] :
600   Elision? AssignmentElement[?Yield, ?Await]
602 AssignmentProperty[Yield, Await] :
603   IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
604   PropertyName[?Yield, ?Await] `:` AssignmentElement[?Yield, ?Await]
606 AssignmentElement[Yield, Await] :
607   DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
609 AssignmentRestElement[Yield, Await] :
610   `...` DestructuringAssignmentTarget[?Yield, ?Await]
612 DestructuringAssignmentTarget[Yield, Await] :
613   LeftHandSideExpression[?Yield, ?Await]
616 @returns Expression
617 Expression[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)
624 @returns Statement
625 Statement[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
655 @returns Statement
656 Declaration[Yield, Await] :
657   HoistableDeclaration[?Yield, ?Await, ~Default]
658     => $0
659   ClassDeclaration[?Yield, ?Await, ~Default]
660     => $0
661   LexicalDeclaration[+In, ?Yield, ?Await]
662     => $0
664 @returns Statement
665 HoistableDeclaration[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
675 @returns Statement
676 BreakableStatement[Yield, Await, Return] :
677   IterationStatement[?Yield, ?Await, ?Return]
678     => $0
679   SwitchStatement[?Yield, ?Await, ?Return]
680     => $0
683 @returns Statement
684 BlockStatement[Yield, Await, Return] :
685   Block[?Yield, ?Await, ?Return]
686     => block_statement($0)
688 @returns Block
689 Block[Yield, Await, Return] :
690   `{` StatementList[?Yield, ?Await, ?Return]? `}`
691     => block($0, $1, $2)
693 @returns Vec<Statement>
694 StatementList[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)
700 @returns Statement
701 StatementListItem[Yield, Await, Return] :
702   Statement[?Yield, ?Await, ?Return]
703     => $0
704   Declaration[?Yield, ?Await]
705     => $0
708 @returns Statement
709 LexicalDeclaration[In, Yield, Await] :
710   LetOrConst BindingList[?In, ?Yield, ?Await] `;`
711     => lexical_declaration($0, $1)
713 @returns VariableDeclarationOrExpression
714 ForLexicalDeclaration[In, Yield, Await] :
715   LetOrConst BindingList[?In, ?Yield, ?Await] `;`
716     => for_lexical_declaration($0, $1)
718 @returns VariableDeclarationKind
719 LetOrConst :
720   `let`
721     => let_kind($0)
722   `const`
723     => const_kind($0)
725 @returns Vec<VariableDeclarator>
726 BindingList[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)
732 @returns VariableDeclarator
733 LexicalBinding[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))
740 @returns Statement
741 VariableStatement[Yield, Await] :
742   `var` VariableDeclarationList[+In, ?Yield, ?Await] `;`
743     => variable_statement($0, $1)
745 @returns Vec<VariableDeclarator>
746 VariableDeclarationList[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)
752 @returns VariableDeclarator
753 VariableDeclaration[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))
760 @returns Binding
761 BindingPattern[Yield, Await] :
762   ObjectBindingPattern[?Yield, ?Await]
763     => $0
764   ArrayBindingPattern[?Yield, ?Await]
765     => $0
767 @returns Binding
768 ObjectBindingPattern[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)
778 @returns Binding
779 ArrayBindingPattern[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)
787 @returns BindingIdentifier
788 BindingRestProperty[Yield, Await] :
789   `...` BindingIdentifier[?Yield, ?Await]
790     => $1
792 @returns Vec<BindingProperty>
793 BindingPropertyList[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)
799 @returns Vec<Option<Parameter>>
800 BindingElementList[Yield, Await] :
801   BindingElisionElement[?Yield, ?Await]
802     => $0
803   BindingElementList[?Yield, ?Await] `,` BindingElisionElement[?Yield, ?Await]
804     => binding_element_list_append($0, $2)
806 @returns Vec<Option<Parameter>>
807 BindingElisionElement[Yield, Await] :
808   Elision? BindingElement[?Yield, ?Await]
809    => binding_elision_element($0, $1)
811 @returns BindingProperty
812 BindingProperty[Yield, Await] :
813   SingleNameBinding[?Yield, ?Await]
814     => binding_property_shorthand($0)
815   PropertyName[?Yield, ?Await] `:` BindingElement[?Yield, ?Await]
816     => binding_property($0, $2)
818 @returns Parameter
819 BindingElement[Yield, Await] :
820   SingleNameBinding[?Yield, ?Await]
821     => $0
822   BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
823     => binding_element_pattern($0, $1)
825 @returns Parameter
826 SingleNameBinding[Yield, Await] :
827   BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]?
828     => single_name_binding($0, $1)
830 @returns Binding
831 BindingRestElement[Yield, Await] :
832   `...` BindingIdentifier[?Yield, ?Await]
833     => binding_identifier_to_binding($1)
834   `...` BindingPattern[?Yield, ?Await]
835     => $1
838 @returns Statement
839 EmptyStatement :
840   `;`
841     => empty_statement($0)
843 @returns Statement
844 ExpressionStatement[Yield, Await] :
845   [lookahead <! {`{`, `function`, `async`, `class`, `let`}] Expression[+In, ?Yield, ?Await] `;`
846     => expression_statement($0)
849 @returns Statement
850 IfStatement[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)
865 @returns Statement
866 IterationStatement[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)
898 @returns VariableDeclarationOrAssignmentTarget
899 ForDeclaration[Yield, Await] :
900   LetOrConst ForBinding[?Yield, ?Await]
901     => for_declaration($0, $1)
903 @returns Binding
904 ForBinding[Yield, Await] :
905   BindingIdentifier[?Yield, ?Await]
906     => binding_identifier_to_binding($0)
907   BindingPattern[?Yield, ?Await]
908     => $0
911 @returns Statement
912 ContinueStatement[Yield, Await] :
913   `continue` `;`
914     => continue_statement($0, None)
915   `continue` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;`
916     => continue_statement($0, Some($1))
919 @returns Statement
920 BreakStatement[Yield, Await] :
921   `break` `;`
922     => break_statement($0, None)
923   `break` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;`
924     => break_statement($0, Some($1))
927 @returns Statement
928 ReturnStatement[Yield, Await] :
929   `return` `;`
930     => return_statement($0, None)
931   `return` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;`
932     => return_statement($0, Some($1))
935 @returns Statement
936 WithStatement[Yield, Await, Return] :
937   `with` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
938     => with_statement($0, $2, $4)
941 @returns Statement
942 SwitchStatement[Yield, Await, Return] :
943   `switch` `(` Expression[+In, ?Yield, ?Await] `)` CaseBlock[?Yield, ?Await, ?Return]
944     => switch_statement($0, $2, $4)
946 @returns Statement
947 CaseBlock[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)
953 @returns Vec<SwitchCase>
954 CaseClauses[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)
960 @returns SwitchCase
961 CaseClause[Yield, Await, Return] :
962   `case` Expression[+In, ?Yield, ?Await] `:` StatementList[?Yield, ?Await, ?Return]?
963     => case_clause($0, $1, $2, $3)
965 @returns SwitchDefault
966 DefaultClause[Yield, Await, Return] :
967   `default` `:` StatementList[?Yield, ?Await, ?Return]?
968     => default_clause($0, $1, $2)
971 @returns Statement
972 LabelledStatement[Yield, Await, Return] :
973   LabelIdentifier[?Yield, ?Await] `:` LabelledItem[?Yield, ?Await, ?Return]
974     => labelled_statement($0, $2)
976 @returns Statement
977 LabelledItem[Yield, Await, Return] :
978   Statement[?Yield, ?Await, ?Return]
979     => $0
980   FunctionDeclaration[?Yield, ?Await, ~Default]
981     => $0
984 @returns Statement
985 ThrowStatement[Yield, Await] :
986   `throw` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;`
987     => throw_statement($0, $1)
989 @returns Statement
990 TryStatement[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))
998 @returns CatchClause
999 Catch[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)
1005 @returns Block
1006 CatchBlock[Yield, Await, Return] :
1007   `{` StatementList[?Yield, ?Await, ?Return]? `}`
1008     => catch_block($0, $1, $2)
1010 @returns Block
1011 Finally[Yield, Await, Return] :
1012   `finally` Block[?Yield, ?Await, ?Return]
1013     => $1
1015 @returns Binding
1016 CatchParameter[Yield, Await] :
1017   BindingIdentifier[?Yield, ?Await]
1018     => binding_identifier_to_binding($0)
1019   BindingPattern[?Yield, ?Await]
1020     => $0
1023 @returns Statement
1024 DebuggerStatement :
1025   `debugger` `;`
1026     => debugger_statement($0)
1029 @returns Statement
1030 FunctionDeclaration[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))
1036 @returns Expression
1037 FunctionExpression :
1038   `function` BindingIdentifier[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
1039     => function_expr(function($0, $1, $2, $3, $4, $5, $6, $7))
1041 @returns FormalParameters
1042 UniqueFormalParameters[Yield, Await] :
1043   FormalParameters[?Yield, ?Await]
1044     => unique_formal_parameters($0)
1046 @returns FormalParameters
1047 FormalParameters[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)
1059 @returns FormalParameters
1060 FormalParameterList[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)
1066 @returns Binding
1067 FunctionRestParameter[Yield, Await] :
1068   BindingRestElement[?Yield, ?Await]
1069     => $0
1071 @returns Parameter
1072 FormalParameter[Yield, Await] :
1073   BindingElement[?Yield, ?Await]
1074     => $0
1076 @returns FunctionBody
1077 FunctionBody[Yield, Await] :
1078   FunctionStatementList[?Yield, ?Await]
1079     => function_body($0)
1081 @returns Vec<Statement>
1082 FunctionStatementList[Yield, Await] :
1083   StatementList[?Yield, ?Await, +Return]?
1084     => function_statement_list($0)
1087 @returns Expression
1088 ArrowFunction[In, Yield, Await] :
1089   ArrowParameters[?Yield, ?Await] [no LineTerminator here] `=>` ConciseBody[?In]
1090     => arrow_function($0, $2)
1092 @returns FormalParameters
1093 ArrowParameters[Yield, Await] :
1094   BindingIdentifier[?Yield, ?Await]
1095     => arrow_parameters_bare($0)
1096   CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
1097     => uncover_arrow_parameters($0)
1099 @returns ArrowExpressionBody
1100 ConciseBody[In] :
1101   [lookahead != `{` ] AssignmentExpression[?In, ~Yield, ~Await]
1102     => concise_body_expression($0)
1103   `{` FunctionBody[~Yield, ~Await] `}`
1104     => concise_body_block($0, $1, $2)
1107 ArrowFormalParameters[Yield, Await] :
1108   `(` UniqueFormalParameters[?Yield, ?Await] `)`
1111 @returns MethodDefinition
1112 MethodDefinition[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)
1126 @returns Parameter
1127 PropertySetParameterList :
1128   FormalParameter[~Yield, ~Await]
1129     => $0
1132 @returns MethodDefinition
1133 GeneratorMethod[Yield, Await] :
1134   `*` ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1135     => generator_method($0, $1, $2, $3, $4, $5, $6, $7)
1137 @returns Statement
1138 GeneratorDeclaration[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))
1144 @returns Expression
1145 GeneratorExpression :
1146   `function` `*` BindingIdentifier[+Yield, ~Await]? `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
1147     => function_expr(generator($0, $2, $3, $4, $5, $6, $7, $8))
1149 @returns FunctionBody
1150 GeneratorBody :
1151   FunctionBody[+Yield, ~Await]
1152     => $0
1154 @returns Expression
1155 YieldExpression[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)
1164 @returns MethodDefinition
1165 AsyncGeneratorMethod[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)
1169 @returns Statement
1170 AsyncGeneratorDeclaration[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))
1176 @returns Expression
1177 AsyncGeneratorExpression :
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))
1181 @returns FunctionBody
1182 AsyncGeneratorBody :
1183   FunctionBody[+Yield, +Await]
1184     => $0
1187 @returns Statement
1188 ClassDeclaration[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)
1194 @returns Expression
1195 ClassExpression[Yield, Await] :
1196   `class` BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await]
1197     => class_expression($0, $1, $2)
1199 @returns ClassExpression
1200 ClassTail[Yield, Await] :
1201   ClassHeritage[?Yield, ?Await]? `{` ClassBody[?Yield, ?Await]? `}`
1202     => class_tail($0, $2, $3)
1204 @returns Expression
1205 ClassHeritage[Yield, Await] :
1206   `extends` LeftHandSideExpression[?Yield, ?Await]
1207     => $1
1209 @returns Vec<Box<ClassElement>>
1210 ClassBody[Yield, Await] :
1211   ClassElementList[?Yield, ?Await]
1212     => $0
1214 @returns Vec<Box<ClassElement>>
1215 ClassElementList[Yield, Await] :
1216   ClassElement[?Yield, ?Await]
1217     => $0
1218   ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await]
1219     => class_element_list_append($0, $1)
1221 @returns ClassElement
1222 FieldDefinition[Yield, Await] :
1223   ClassElementName[?Yield, ?Await] Initializer[+In, ~Yield, ~Await]?
1224     => class_field_definition($0, $1)
1226 @returns ClassElementName
1227 ClassElementName[Yield, Await] :
1228   PropertyName[?Yield, ?Await]
1229     => property_name_to_class_element_name($0)
1230   PrivateIdentifier
1231     => class_element_name_private($0)
1233 @returns Vec<Box<ClassElement>>
1234 ClassElement[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()
1247 @returns Statement
1248 AsyncFunctionDeclaration[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))
1254 @returns Expression
1255 AsyncFunctionExpression :
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))
1261 @returns MethodDefinition
1262 AsyncMethod[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)
1266 @returns FunctionBody
1267 AsyncFunctionBody :
1268   FunctionBody[~Yield, +Await]
1269     => $0
1271 @returns Expression
1272 AwaitExpression[Yield] :
1273   `await` UnaryExpression[?Yield, +Await]
1274     => await_expr($0, $1)
1277 @returns Expression
1278 AsyncArrowFunction[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)
1284 @returns ArrowExpressionBody
1285 AsyncConciseBody[In] :
1286   [lookahead != `{`] AssignmentExpression[?In, ~Yield, +Await]
1287     => concise_body_expression($0)
1288   `{` AsyncFunctionBody `}`
1289     => concise_body_block($0, $1, $2)
1291 @returns BindingIdentifier
1292 AsyncArrowBindingIdentifier[Yield] :
1293   BindingIdentifier[?Yield, +Await]
1294     => $0
1296 @returns Expression
1297 CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
1298   MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
1299     => call_expr($0, $1)
1302 AsyncArrowHead :
1303   `async` [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
1306 @returns Script
1307 Script :
1308   ScriptBody?
1309     => script($0)
1311 @returns Script
1312 ScriptBody :
1313   StatementList[~Yield, ~Await, ~Return]
1314     => script_body($0)
1316 @returns Vec<Statement>
1317 Module :
1318   ModuleBody?
1319     => module($0)
1321 @returns Vec<Statement>
1322 ModuleBody :
1323   ModuleItemList
1324     => $0
1326 @returns Vec<Statement>
1327 ModuleItemList :
1328   ModuleItem
1329     => module_item_list_single($0)
1330   ModuleItemList ModuleItem
1331     => module_item_list_append($0, $1)
1333 @returns Statement
1334 ModuleItem :
1335   ImportDeclaration
1336     => $0
1337   ExportDeclaration
1338     => $0
1339   StatementListItem[~Yield, ~Await, ~Return]
1340     => $0
1343 @returns Statement
1344 ImportDeclaration :
1345   `import` ImportClause FromClause `;`
1346     => import_declaration(Some($1), $2)
1347   `import` ModuleSpecifier `;`
1348     => import_declaration(None, $1)
1350 @returns Void
1351 ImportClause :
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))
1363 @returns BindingIdentifier
1364 ImportedDefaultBinding :
1365   ImportedBinding
1366     => $0
1368 @returns Void
1369 NameSpaceImport :
1370   `*` `as` ImportedBinding
1371     => name_space_import($2)
1373 @returns Void
1374 NamedImports :
1375   `{` `}`
1376     => imports_list_empty()
1377   `{` ImportsList `}`
1378     => $1
1379   `{` ImportsList `,` `}`
1380     => $1
1382 @returns Token
1383 FromClause :
1384   `from` ModuleSpecifier
1385     => $1
1387 @returns Void
1388 ImportsList :
1389   ImportSpecifier
1390     => imports_list_append(imports_list_empty(), $0)
1391   ImportsList `,` ImportSpecifier
1392     => imports_list_append($0, $2)
1394 @returns Void
1395 ImportSpecifier :
1396   ImportedBinding
1397     => import_specifier($0)
1398   IdentifierName `as` ImportedBinding
1399     => import_specifier_renaming($0, $2)
1401 @returns Token
1402 ModuleSpecifier :
1403   StringLiteral
1404     => module_specifier($0)
1406 @returns BindingIdentifier
1407 ImportedBinding :
1408   BindingIdentifier[~Yield, ~Await]
1409     => $0
1412 @returns Statement
1413 ExportDeclaration :
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)
1431 @returns Void
1432 ExportClause :
1433   `{` `}`
1434     => exports_list_empty()
1435   `{` ExportsList `}`
1436     => $1
1437   `{` ExportsList `,` `}`
1438     => $1
1440 @returns Void
1441 ExportsList :
1442   ExportSpecifier
1443     => exports_list_append(exports_list_empty(), $0)
1444   ExportsList `,` ExportSpecifier
1445     => exports_list_append($0, $2)
1447 @returns Void
1448 ExportSpecifier :
1449   IdentifierName
1450     => export_specifier($0)
1451   IdentifierName `as` IdentifierName
1452     => export_specifier_renaming($0, $2)