@returns Identifier IdentifierReference[Yield, Await] : Identifier => identifier_reference($0) @returns BindingIdentifier BindingIdentifier[Yield, Await] : Identifier => binding_identifier($0) `yield` => binding_identifier_yield($0) `await` => binding_identifier_await($0) @returns Label LabelIdentifier[Yield, Await] : Identifier => label_identifier($0) @returns Expression PrimaryExpression[Yield, Await] : `this` => this_expr($0) IdentifierReference[?Yield, ?Await] => identifier_expr($0) Literal => $0 ArrayLiteral[?Yield, ?Await] => $0 ObjectLiteral[?Yield, ?Await] => $0 FunctionExpression => $0 ClassExpression[?Yield, ?Await] => $0 GeneratorExpression => $0 AsyncFunctionExpression => $0 AsyncGeneratorExpression => $0 RegularExpressionLiteral => regexp_literal($0) TemplateLiteral[?Yield, ?Await, ~Tagged] => untagged_template_expr($0) CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] => uncover_parenthesized_expression($0) @returns CoverParenthesized CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : `(` Expression[+In, ?Yield, ?Await] `)` => cover_parenthesized_expression($0, $1, $2) `(` Expression[+In, ?Yield, ?Await] `,` `)` => cover_arrow_parameter_list($0, expression_to_parameter_list($1), None, $3) `(` `)` => cover_arrow_parameter_list($0, empty_parameter_list(), None, $1) `(` `...` BindingIdentifier[?Yield, ?Await] `)` => cover_arrow_parameter_list($0, empty_parameter_list(), Some(binding_identifier_to_binding($2)), $3) `(` `...` BindingPattern[?Yield, ?Await] `)` => cover_arrow_parameter_list($0, empty_parameter_list(), Some($2), $3) `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingIdentifier[?Yield, ?Await] `)` => cover_arrow_parameter_list($0, expression_to_parameter_list($1), Some(binding_identifier_to_binding($4)), $5) `(` Expression[+In, ?Yield, ?Await] `,` `...` BindingPattern[?Yield, ?Await] `)` => cover_arrow_parameter_list($0, expression_to_parameter_list($1), Some($4), $5) @returns Expression Literal : NullLiteral => null_literal($0) BooleanLiteral => boolean_literal($0) NumericLiteral => numeric_literal($0) BigIntLiteral => bigint_literal($0) StringLiteral => string_literal($0) @returns Expression ArrayLiteral[Yield, Await] : `[` Elision? `]` => array_literal_empty($0, $1, $2) `[` ElementList[?Yield, ?Await] `]` => array_literal($0, $1, $2) `[` ElementList[?Yield, ?Await] `,` Elision? `]` => array_literal_with_trailing_elision($0,$1, $3, $4) @returns ArrayExpression ElementList[Yield, Await] : Elision? AssignmentExpression[+In, ?Yield, ?Await] => element_list_first($0, $1) Elision? SpreadElement[?Yield, ?Await] => element_list_first_spread($0, $1) ElementList[?Yield, ?Await] `,` Elision? AssignmentExpression[+In, ?Yield, ?Await] => element_list_append($0, $2, $3) ElementList[?Yield, ?Await] `,` Elision? SpreadElement[?Yield, ?Await] => element_list_append_spread($0, $2, $3) @returns ArrayExpression Elision : `,` => elision_single($0) Elision `,` => elision_append($0, $1) @returns Expression SpreadElement[Yield, Await] : `...` AssignmentExpression[+In, ?Yield, ?Await] => spread_element($1) @returns Expression ObjectLiteral[Yield, Await] : `{` `}` => object_literal_empty($0, $1) `{` PropertyDefinitionList[?Yield, ?Await] `}` => object_literal($0, $1, $2) `{` PropertyDefinitionList[?Yield, ?Await] `,` `}` => object_literal($0, $1, $2) @returns ObjectExpression PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] => property_definition_list_single($0) PropertyDefinitionList[?Yield, ?Await] `,` PropertyDefinition[?Yield, ?Await] => property_definition_list_append($0, $2) @returns ObjectProperty PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] => shorthand_property($0) CoverInitializedName[?Yield, ?Await] => $0 PropertyName[?Yield, ?Await] `:` AssignmentExpression[+In, ?Yield, ?Await] => property_definition($0, $2) MethodDefinition[?Yield, ?Await] => property_definition_method($0) `...` AssignmentExpression[+In, ?Yield, ?Await] => property_definition_spread($1) @returns PropertyName PropertyName[Yield, Await] : LiteralPropertyName => $0 ComputedPropertyName[?Yield, ?Await] => $0 @returns PropertyName LiteralPropertyName : IdentifierName => property_name_identifier($0) StringLiteral => property_name_string($0) NumericLiteral => property_name_numeric($0) BigIntLiteral => property_name_bigint($0) @returns PropertyName ComputedPropertyName[Yield, Await] : `[` AssignmentExpression[+In, ?Yield, ?Await] `]` => computed_property_name($0, $1, $2) @returns ObjectProperty CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] => cover_initialized_name($0, $1) @returns Expression Initializer[In, Yield, Await] : `=` AssignmentExpression[?In, ?Yield, ?Await] => $1 @returns TemplateExpression TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate => template_literal($0) SubstitutionTemplate[?Yield, ?Await, ?Tagged] => $0 @returns TemplateExpression SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] => substitution_template($0, $1, $2) @returns Void TemplateSpans[Yield, Await, Tagged] : TemplateTail => template_spans(None, $0) TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail => template_spans(Some($0), $1) @returns Void TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] => template_middle_list_single($0, $1) TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await] => template_middle_list_append($0, $1, $2) @returns Expression MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] => $0 MemberExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]` => computed_member_expr($0, $2, $3) MemberExpression[?Yield, ?Await] `.` IdentifierName => static_member_expr($0, $2) MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] => tagged_template_expr($0, $1) SuperProperty[?Yield, ?Await] => $0 MetaProperty => $0 `new` MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] => new_expr_with_arguments($0, $1, $2) MemberExpression[?Yield, ?Await] `.` PrivateIdentifier => private_field_expr($0, $2) @returns Expression SuperProperty[Yield, Await] : `super` `[` Expression[+In, ?Yield, ?Await] `]` => super_property_computed($0, $2, $3) `super` `.` IdentifierName => super_property_static($0, $2) @returns Expression MetaProperty : NewTarget => $0 @returns Expression NewTarget : `new` `.` `target` => new_target_expr($0, $2) @returns Expression NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] => $0 `new` NewExpression[?Yield, ?Await] => new_expr_without_arguments($0, $1) @returns Expression CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] => $0 SuperCall[?Yield, ?Await] => $0 ImportCall[?Yield, ?Await] => $0 CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] => call_expr($0, $1) CallExpression[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]` => computed_member_expr($0, $2, $3) CallExpression[?Yield, ?Await] `.` IdentifierName => static_member_expr($0, $2) CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] => tagged_template_expr($0, $1) CallExpression[?Yield, ?Await] `.` PrivateIdentifier => private_field_expr($0, $2) @returns Expression SuperCall[Yield, Await] : `super` Arguments[?Yield, ?Await] => super_call($0, $1) @returns Expression ImportCall[Yield, Await] : `import` `(` AssignmentExpression[+In, ?Yield, ?Await] `)` => import_call($0, $2, $3) @returns Arguments Arguments[Yield, Await] : `(` `)` => arguments_empty($0, $1) `(` ArgumentList[?Yield, ?Await] `)` => arguments($0, $1, $2) `(` ArgumentList[?Yield, ?Await] `,` `)` => arguments($0, $1, $3) @returns Arguments ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] => arguments_single($0) `...` AssignmentExpression[+In, ?Yield, ?Await] => arguments_spread_single($1) ArgumentList[?Yield, ?Await] `,` AssignmentExpression[+In, ?Yield, ?Await] => arguments_append($0, $2) ArgumentList[?Yield, ?Await] `,` `...` AssignmentExpression[+In, ?Yield, ?Await] => arguments_append_spread($0, $3) @returns Expression OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] => optional_expr($0, $1) CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] => optional_expr($0, $1) OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] => optional_expr($0, $1) @returns Expression OptionalChain[Yield, Await] : `?.` `[` Expression[+In, ?Yield, ?Await] `]` => optional_computed_member_expr_tail($0, $2, $3) `?.` IdentifierName => optional_static_member_expr_tail($0, $1) `?.` PrivateIdentifier => optional_private_field_member_expr_tail($0, $1) `?.` Arguments[?Yield, ?Await] => optional_call_expr_tail($0, $1) `?.` TemplateLiteral[?Yield, ?Await, +Tagged] => error_optional_chain_with_template() OptionalChain[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]` => optional_computed_member_expr($0, $2, $3) OptionalChain[?Yield, ?Await] `.` IdentifierName => optional_static_member_expr($0, $2) OptionalChain[?Yield, ?Await] `.` PrivateIdentifier => optional_private_field_member_expr($0, $2) OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] => optional_call_expr($0, $1) OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] => error_optional_chain_with_template() @returns Expression LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] => $0 CallExpression[?Yield, ?Await] => $0 OptionalExpression[?Yield, ?Await] => $0 @returns Expression CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] => call_expr($0, $1) @returns Expression UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] => $0 LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] `++` => post_increment_expr($0, $1) LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] `--` => post_decrement_expr($0, $1) `++` UnaryExpression[?Yield, ?Await] => pre_decrement_expr($0, $1) `--` UnaryExpression[?Yield, ?Await] => pre_decrement_expr($0, $1) @returns Expression UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] => $0 `delete` UnaryExpression[?Yield, ?Await] => delete_expr($0, $1) `void` UnaryExpression[?Yield, ?Await] => void_expr($0, $1) `typeof` UnaryExpression[?Yield, ?Await] => typeof_expr($0, $1) `+` UnaryExpression[?Yield, ?Await] => unary_plus_expr($0, $1) `-` UnaryExpression[?Yield, ?Await] => unary_minus_expr($0, $1) `~` UnaryExpression[?Yield, ?Await] => bitwise_not_expr($0, $1) `!` UnaryExpression[?Yield, ?Await] => logical_not_expr($0, $1) [+Await] AwaitExpression[?Yield] => $0 @returns Expression ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] => $0 UpdateExpression[?Yield, ?Await] `**` ExponentiationExpression[?Yield, ?Await] => binary_expr(pow_op($1), $0, $2) @returns Expression MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] => $0 MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] => multiplicative_expr($0, $1, $2) @returns BinaryOperator MultiplicativeOperator : `*` => box_op(mul_op($0)) `/` => box_op(div_op($0)) `%` => box_op(mod_op($0)) @returns Expression AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] => $0 AdditiveExpression[?Yield, ?Await] `+` MultiplicativeExpression[?Yield, ?Await] => binary_expr(add_op($1), $0, $2) AdditiveExpression[?Yield, ?Await] `-` MultiplicativeExpression[?Yield, ?Await] => binary_expr(sub_op($1), $0, $2) @returns Expression ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] => $0 ShiftExpression[?Yield, ?Await] `<<` AdditiveExpression[?Yield, ?Await] => binary_expr(left_shift_op($1), $0, $2) ShiftExpression[?Yield, ?Await] `>>` AdditiveExpression[?Yield, ?Await] => binary_expr(right_shift_op($1), $0, $2) ShiftExpression[?Yield, ?Await] `>>>` AdditiveExpression[?Yield, ?Await] => binary_expr(right_shift_ext_op($1), $0, $2) @returns Expression RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] => $0 RelationalExpression[?In, ?Yield, ?Await] `<` ShiftExpression[?Yield, ?Await] => binary_expr(less_than_op($1), $0, $2) RelationalExpression[?In, ?Yield, ?Await] `>` ShiftExpression[?Yield, ?Await] => binary_expr(greater_than_op($1), $0, $2) RelationalExpression[?In, ?Yield, ?Await] `<=` ShiftExpression[?Yield, ?Await] => binary_expr(less_than_or_equal_op($1), $0, $2) RelationalExpression[?In, ?Yield, ?Await] `>=` ShiftExpression[?Yield, ?Await] => binary_expr(greater_than_or_equal_op($1), $0, $2) RelationalExpression[?In, ?Yield, ?Await] `instanceof` ShiftExpression[?Yield, ?Await] => binary_expr(instanceof_op($1), $0, $2) [+In] RelationalExpression[+In, ?Yield, ?Await] `in` ShiftExpression[?Yield, ?Await] => binary_expr(in_op($1), $0, $2) @returns Expression EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] => $0 EqualityExpression[?In, ?Yield, ?Await] `==` RelationalExpression[?In, ?Yield, ?Await] => binary_expr(equals_op($1), $0, $2) EqualityExpression[?In, ?Yield, ?Await] `!=` RelationalExpression[?In, ?Yield, ?Await] => binary_expr(not_equals_op($1), $0, $2) EqualityExpression[?In, ?Yield, ?Await] `===` RelationalExpression[?In, ?Yield, ?Await] => binary_expr(strict_equals_op($1), $0, $2) EqualityExpression[?In, ?Yield, ?Await] `!==` RelationalExpression[?In, ?Yield, ?Await] => binary_expr(strict_not_equals_op($1), $0, $2) @returns Expression BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] => $0 BitwiseANDExpression[?In, ?Yield, ?Await] `&` EqualityExpression[?In, ?Yield, ?Await] => binary_expr(bitwise_and_op($1), $0, $2) @returns Expression BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] => $0 BitwiseXORExpression[?In, ?Yield, ?Await] `^` BitwiseANDExpression[?In, ?Yield, ?Await] => binary_expr(bitwise_xor_op($1), $0, $2) @returns Expression BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] => $0 BitwiseORExpression[?In, ?Yield, ?Await] `|` BitwiseXORExpression[?In, ?Yield, ?Await] => binary_expr(bitwise_or_op($1), $0, $2) @returns Expression LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] => $0 LogicalANDExpression[?In, ?Yield, ?Await] `&&` BitwiseORExpression[?In, ?Yield, ?Await] => binary_expr(logical_and_op($1), $0, $2) @returns Expression LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] => $0 LogicalORExpression[?In, ?Yield, ?Await] `||` LogicalANDExpression[?In, ?Yield, ?Await] => binary_expr(logical_or_op($1), $0, $2) @returns Expression ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] => $0 CoalesceExpression[?In, ?Yield, ?Await] => $0 @returns Expression CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] `??` BitwiseORExpression[?In, ?Yield, ?Await] => binary_expr(coalesce_op($1), $0, $2) @returns Expression CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] => $0 BitwiseORExpression[?In, ?Yield, ?Await] => $0 @returns Expression ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] => $0 ShortCircuitExpression[?In, ?Yield, ?Await] `?` AssignmentExpression[+In, ?Yield, ?Await] `:` AssignmentExpression[?In, ?Yield, ?Await] => conditional_expr($0, $2, $4) @returns Expression AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] => $0 [+Yield] YieldExpression[?In, ?Await] => $0 ArrowFunction[?In, ?Yield, ?Await] => $0 AsyncArrowFunction[?In, ?Yield, ?Await] => $0 LeftHandSideExpression[?Yield, ?Await] `=` AssignmentExpression[?In, ?Yield, ?Await] => assignment_expr($0, $2) LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] => compound_assignment_expr($0, $1, $2) LeftHandSideExpression[?Yield, ?Await] LogicalAssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] => compound_assignment_expr($0, $1, $2) @returns CompoundAssignmentOperator AssignmentOperator : `*=` => box_assign_op(mul_assign_op($0)) `/=` => box_assign_op(div_assign_op($0)) `%=` => box_assign_op(mod_assign_op($0)) `+=` => box_assign_op(add_assign_op($0)) `-=` => box_assign_op(sub_assign_op($0)) `<<=` => box_assign_op(left_shift_assign_op($0)) `>>=` => box_assign_op(right_shift_assign_op($0)) `>>>=` => box_assign_op(right_shift_ext_assign_op($0)) `&=` => box_assign_op(bitwise_and_assign_op($0)) `^=` => box_assign_op(bitwise_xor_assign_op($0)) `|=` => box_assign_op(bitwise_or_assign_op($0)) `**=` => box_assign_op(pow_assign_op($0)) @returns CompoundAssignmentOperator LogicalAssignmentOperator : `&&=` => box_assign_op(logical_and_assign_op($0)) `||=` => box_assign_op(logical_or_assign_op($0)) `??=` => box_assign_op(coalesce_assign_op($0)) AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : `{` `}` `{` AssignmentRestProperty[?Yield, ?Await] `}` `{` AssignmentPropertyList[?Yield, ?Await] `}` `{` AssignmentPropertyList[?Yield, ?Await] `,` AssignmentRestProperty[?Yield, ?Await]? `}` ArrayAssignmentPattern[Yield, Await] : `[` Elision? AssignmentRestElement[?Yield, ?Await]? `]` `[` AssignmentElementList[?Yield, ?Await] `]` `[` AssignmentElementList[?Yield, ?Await] `,` Elision? AssignmentRestElement[?Yield, ?Await]? `]` AssignmentRestProperty[Yield, Await] : `...` DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] `,` AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] `,` AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elision? AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]? PropertyName[?Yield, ?Await] `:` AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]? AssignmentRestElement[Yield, Await] : `...` DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] @returns Expression Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] => $0 Expression[?In, ?Yield, ?Await] `,` AssignmentExpression[?In, ?Yield, ?Await] => binary_expr(comma_op($1), $0, $2) @returns Statement Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] => $0 VariableStatement[?Yield, ?Await] => $0 EmptyStatement => $0 ExpressionStatement[?Yield, ?Await] => $0 IfStatement[?Yield, ?Await, ?Return] => $0 BreakableStatement[?Yield, ?Await, ?Return] => $0 ContinueStatement[?Yield, ?Await] => $0 BreakStatement[?Yield, ?Await] => $0 [+Return] ReturnStatement[?Yield, ?Await] => $0 WithStatement[?Yield, ?Await, ?Return] => $0 LabelledStatement[?Yield, ?Await, ?Return] => $0 ThrowStatement[?Yield, ?Await] => $0 TryStatement[?Yield, ?Await, ?Return] => $0 DebuggerStatement => $0 @returns Statement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] => $0 ClassDeclaration[?Yield, ?Await, ~Default] => $0 LexicalDeclaration[+In, ?Yield, ?Await] => $0 @returns Statement HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] => $0 GeneratorDeclaration[?Yield, ?Await, ?Default] => $0 AsyncFunctionDeclaration[?Yield, ?Await, ?Default] => $0 AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] => $0 @returns Statement BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] => $0 SwitchStatement[?Yield, ?Await, ?Return] => $0 @returns Statement BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] => block_statement($0) @returns Block Block[Yield, Await, Return] : `{` StatementList[?Yield, ?Await, ?Return]? `}` => block($0, $1, $2) @returns Vec StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] => statement_list_single($0) StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] => statement_list_append($0, $1) @returns Statement StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] => $0 Declaration[?Yield, ?Await] => $0 @returns Statement LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] `;` => lexical_declaration($0, $1) @returns VariableDeclarationOrExpression ForLexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] `;` => for_lexical_declaration($0, $1) @returns VariableDeclarationKind LetOrConst : `let` => let_kind($0) `const` => const_kind($0) @returns Vec BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] => variable_declaration_list_single($0) BindingList[?In, ?Yield, ?Await] `,` LexicalBinding[?In, ?Yield, ?Await] => variable_declaration_list_append($0, $2) @returns VariableDeclarator LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]? => variable_declaration(binding_identifier_to_binding($0), $1) BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] => variable_declaration($0, Some($1)) @returns Statement VariableStatement[Yield, Await] : `var` VariableDeclarationList[+In, ?Yield, ?Await] `;` => variable_statement($0, $1) @returns Vec VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] => variable_declaration_list_single($0) VariableDeclarationList[?In, ?Yield, ?Await] `,` VariableDeclaration[?In, ?Yield, ?Await] => variable_declaration_list_append($0, $2) @returns VariableDeclarator VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]? => variable_declaration(binding_identifier_to_binding($0), $1) BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] => variable_declaration($0, Some($1)) @returns Binding BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] => $0 ArrayBindingPattern[?Yield, ?Await] => $0 @returns Binding ObjectBindingPattern[Yield, Await] : `{` `}` => object_binding_pattern($0, binding_property_list_empty(), None, $1) `{` BindingRestProperty[?Yield, ?Await] `}` => object_binding_pattern($0, binding_property_list_empty(), Some($1), $2) `{` BindingPropertyList[?Yield, ?Await] `}` => object_binding_pattern($0, $1, None, $2) `{` BindingPropertyList[?Yield, ?Await] `,` BindingRestProperty[?Yield, ?Await]? `}` => object_binding_pattern($0, $1, $3, $4) @returns Binding ArrayBindingPattern[Yield, Await] : `[` Elision? BindingRestElement[?Yield, ?Await]? `]` => array_binding_pattern($0, binding_element_list_empty(), $1, $2, $3) `[` BindingElementList[?Yield, ?Await] `]` => array_binding_pattern($0, $1, None, None, $2) `[` BindingElementList[?Yield, ?Await] `,` Elision? BindingRestElement[?Yield, ?Await]? `]` => array_binding_pattern($0, $1, $3, $4, $5) @returns BindingIdentifier BindingRestProperty[Yield, Await] : `...` BindingIdentifier[?Yield, ?Await] => $1 @returns Vec BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] => binding_property_list_single($0) BindingPropertyList[?Yield, ?Await] `,` BindingProperty[?Yield, ?Await] => binding_property_list_append($0, $2) @returns Vec> BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] => $0 BindingElementList[?Yield, ?Await] `,` BindingElisionElement[?Yield, ?Await] => binding_element_list_append($0, $2) @returns Vec> BindingElisionElement[Yield, Await] : Elision? BindingElement[?Yield, ?Await] => binding_elision_element($0, $1) @returns BindingProperty BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] => binding_property_shorthand($0) PropertyName[?Yield, ?Await] `:` BindingElement[?Yield, ?Await] => binding_property($0, $2) @returns Parameter BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] => $0 BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]? => binding_element_pattern($0, $1) @returns Parameter SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]? => single_name_binding($0, $1) @returns Binding BindingRestElement[Yield, Await] : `...` BindingIdentifier[?Yield, ?Await] => binding_identifier_to_binding($1) `...` BindingPattern[?Yield, ?Await] => $1 @returns Statement EmptyStatement : `;` => empty_statement($0) @returns Statement ExpressionStatement[Yield, Await] : [lookahead expression_statement($0) @returns Statement IfStatement[Yield, Await, Return] : `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` Statement[?Yield, ?Await, ?Return] => if_statement($0, $2, $4, Some($6)) `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] [lookahead != `else`] => if_statement($0, $2, $4, None) `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` Statement[?Yield, ?Await, ?Return] => if_statement($0, $2, make_block_stmt_from_function_decl($4), Some($6)) `if` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] `else` FunctionDeclaration[?Yield, ?Await, ~Default] => if_statement($0, $2, $4, Some(make_block_stmt_from_function_decl($6))) `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] `else` FunctionDeclaration[?Yield, ?Await, ~Default] => if_statement($0, $2, make_block_stmt_from_function_decl($4), Some(make_block_stmt_from_function_decl($6))) `if` `(` Expression[+In, ?Yield, ?Await] `)` FunctionDeclaration[?Yield, ?Await, ~Default] [lookahead != `else`] => if_statement($0, $2, make_block_stmt_from_function_decl($4), None) @returns Statement IterationStatement[Yield, Await, Return] : `do` Statement[?Yield, ?Await, ?Return] `while` `(` Expression[+In, ?Yield, ?Await] `)` `;` => do_while_statement($0, $1, $4, $5) `while` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => while_statement($0, $2, $4) `for` `(` [lookahead != `let`] Expression[~In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return] => for_statement($0, for_expression($2), $4, $6, $8) `for` `(` `var` VariableDeclarationList[~In, ?Yield, ?Await] `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return] => for_statement($0, Some(for_var_declaration($2, $3)), $5, $7, $9) `for` `(` ForLexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return] => for_statement_lexical($0, unbox_for_lexical_declaration($2), $3, $5, $7) `for` `(` [lookahead != `let`] LeftHandSideExpression[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_in_statement($0, for_assignment_target($2), $4, $6) `for` `(` `var` ForBinding[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_in_statement($0, for_in_or_of_var_declaration($2, $3, None), $5, $7) `for` `(` `var` BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_in_statement($0, for_in_or_of_var_declaration($2, binding_identifier_to_binding($3), Some($4)), $6, $8) `for` `(` ForDeclaration[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_in_statement_lexical($0, unbox_for_declaration($2), $4, $6) `for` `(` [lookahead for_of_statement($0, for_assignment_target($2), $4, $6) `for` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_of_statement($0, for_in_or_of_var_declaration($2, $3, None), $5, $7) `for` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_of_statement_lexical($0, unbox_for_declaration($2), $4, $6) [+Await] `for` `await` `(` [lookahead for_await_of_statement($0, for_assignment_target($3), $5, $7) [+Await] `for` `await` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_await_of_statement($0, for_in_or_of_var_declaration($3, $4, None), $6, $8) [+Await] `for` `await` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => for_await_of_statement_lexical($0, unbox_for_declaration($3), $5, $7) @returns VariableDeclarationOrAssignmentTarget ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] => for_declaration($0, $1) @returns Binding ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] => binding_identifier_to_binding($0) BindingPattern[?Yield, ?Await] => $0 @returns Statement ContinueStatement[Yield, Await] : `continue` `;` => continue_statement($0, None) `continue` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;` => continue_statement($0, Some($1)) @returns Statement BreakStatement[Yield, Await] : `break` `;` => break_statement($0, None) `break` [no LineTerminator here] LabelIdentifier[?Yield, ?Await] `;` => break_statement($0, Some($1)) @returns Statement ReturnStatement[Yield, Await] : `return` `;` => return_statement($0, None) `return` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;` => return_statement($0, Some($1)) @returns Statement WithStatement[Yield, Await, Return] : `with` `(` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return] => with_statement($0, $2, $4) @returns Statement SwitchStatement[Yield, Await, Return] : `switch` `(` Expression[+In, ?Yield, ?Await] `)` CaseBlock[?Yield, ?Await, ?Return] => switch_statement($0, $2, $4) @returns Statement CaseBlock[Yield, Await, Return] : `{` CaseClauses[?Yield, ?Await, ?Return]? `}` => case_block($0, $1, $2) `{` CaseClauses[?Yield, ?Await, ?Return]? DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]? `}` => case_block_with_default($0, $1, $2, $3, $4) @returns Vec CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] => case_clauses_single($0) CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] => case_clauses_append($0, $1) @returns SwitchCase CaseClause[Yield, Await, Return] : `case` Expression[+In, ?Yield, ?Await] `:` StatementList[?Yield, ?Await, ?Return]? => case_clause($0, $1, $2, $3) @returns SwitchDefault DefaultClause[Yield, Await, Return] : `default` `:` StatementList[?Yield, ?Await, ?Return]? => default_clause($0, $1, $2) @returns Statement LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] `:` LabelledItem[?Yield, ?Await, ?Return] => labelled_statement($0, $2) @returns Statement LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] => $0 FunctionDeclaration[?Yield, ?Await, ~Default] => $0 @returns Statement ThrowStatement[Yield, Await] : `throw` [no LineTerminator here] Expression[+In, ?Yield, ?Await] `;` => throw_statement($0, $1) @returns Statement TryStatement[Yield, Await, Return] : `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] => try_statement($0, $1, Some($2), None) `try` Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] => try_statement($0, $1, None, Some($2)) `try` Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] => try_statement($0, $1, Some($2), Some($3)) @returns CatchClause Catch[Yield, Await, Return] : `catch` `(` CatchParameter[?Yield, ?Await] `)` CatchBlock[?Yield, ?Await, ?Return] => catch($0, $2, $4) `catch` Block[?Yield, ?Await, ?Return] => catch_no_param($0, $1) @returns Block CatchBlock[Yield, Await, Return] : `{` StatementList[?Yield, ?Await, ?Return]? `}` => catch_block($0, $1, $2) @returns Block Finally[Yield, Await, Return] : `finally` Block[?Yield, ?Await, ?Return] => $1 @returns Binding CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] => binding_identifier_to_binding($0) BindingPattern[?Yield, ?Await] => $0 @returns Statement DebuggerStatement : `debugger` `;` => debugger_statement($0) @returns Statement FunctionDeclaration[Yield, Await, Default] : `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}` => function_decl(function($0, Some($1), $2, $3, $4, $5, $6, $7)) [+Default] `function` `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}` => function_decl(function($0, None, $1, $2, $3, $4, $5, $6)) @returns Expression FunctionExpression : `function` BindingIdentifier[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}` => function_expr(function($0, $1, $2, $3, $4, $5, $6, $7)) @returns FormalParameters UniqueFormalParameters[Yield, Await] : FormalParameters[?Yield, ?Await] => unique_formal_parameters($0) @returns FormalParameters FormalParameters[Yield, Await] : [empty] => empty_formal_parameters() FunctionRestParameter[?Yield, ?Await] => with_rest_parameter(empty_formal_parameters(), $0) FormalParameterList[?Yield, ?Await] => $0 FormalParameterList[?Yield, ?Await] `,` => $0 FormalParameterList[?Yield, ?Await] `,` FunctionRestParameter[?Yield, ?Await] => with_rest_parameter($0, $2) @returns FormalParameters FormalParameterList[Yield, Await] : FormalParameter[?Yield, ?Await] => formal_parameter_list_single($0) FormalParameterList[?Yield, ?Await] `,` FormalParameter[?Yield, ?Await] => formal_parameter_list_append($0, $2) @returns Binding FunctionRestParameter[Yield, Await] : BindingRestElement[?Yield, ?Await] => $0 @returns Parameter FormalParameter[Yield, Await] : BindingElement[?Yield, ?Await] => $0 @returns FunctionBody FunctionBody[Yield, Await] : FunctionStatementList[?Yield, ?Await] => function_body($0) @returns Vec FunctionStatementList[Yield, Await] : StatementList[?Yield, ?Await, +Return]? => function_statement_list($0) @returns Expression ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] `=>` ConciseBody[?In] => arrow_function($0, $2) @returns FormalParameters ArrowParameters[Yield, Await] : BindingIdentifier[?Yield, ?Await] => arrow_parameters_bare($0) CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] => uncover_arrow_parameters($0) @returns ArrowExpressionBody ConciseBody[In] : [lookahead != `{` ] AssignmentExpression[?In, ~Yield, ~Await] => concise_body_expression($0) `{` FunctionBody[~Yield, ~Await] `}` => concise_body_block($0, $1, $2) ArrowFormalParameters[Yield, Await] : `(` UniqueFormalParameters[?Yield, ?Await] `)` @returns MethodDefinition MethodDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}` => method_definition($0, $1, $2, $3, $4, $5, $6) GeneratorMethod[?Yield, ?Await] => $0 AsyncMethod[?Yield, ?Await] => $0 AsyncGeneratorMethod[?Yield, ?Await] => $0 `get` ClassElementName[?Yield, ?Await] `(` `)` `{` FunctionBody[~Yield, ~Await] `}` => getter($0, $1, $4, $5, $6) `set` ClassElementName[?Yield, ?Await] `(` PropertySetParameterList `)` `{` FunctionBody[~Yield, ~Await] `}` => setter($0, $1, $2, $3, $4, $5, $6, $7) @returns Parameter PropertySetParameterList : FormalParameter[~Yield, ~Await] => $0 @returns MethodDefinition GeneratorMethod[Yield, Await] : `*` ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}` => generator_method($0, $1, $2, $3, $4, $5, $6, $7) @returns Statement GeneratorDeclaration[Yield, Await, Default] : `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}` => function_decl(generator($0, Some($2), $3, $4, $5, $6, $7, $8)) [+Default] `function` `*` `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}` => function_decl(generator($0, None, $2, $3, $4, $5, $6, $7)) @returns Expression GeneratorExpression : `function` `*` BindingIdentifier[+Yield, ~Await]? `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}` => function_expr(generator($0, $2, $3, $4, $5, $6, $7, $8)) @returns FunctionBody GeneratorBody : FunctionBody[+Yield, ~Await] => $0 @returns Expression YieldExpression[In, Await] : `yield` => yield_expr($0, None) `yield` [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] => yield_expr($0, Some($1)) `yield` [no LineTerminator here] `*` AssignmentExpression[?In, +Yield, ?Await] => yield_star_expr($0, $2) @returns MethodDefinition AsyncGeneratorMethod[Yield, Await] : `async` [no LineTerminator here] `*` ClassElementName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}` => async_generator_method($0, $2, $3, $4, $5, $6, $7, $8) @returns Statement AsyncGeneratorDeclaration[Yield, Await, Default] : `async` [no LineTerminator here] `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}` => function_decl(async_generator($0, Some($3), $4, $5, $6, $7, $8, $9)) [+Default] `async` [no LineTerminator here] `function` `*` `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}` => function_decl(async_generator($0, None, $3, $4, $5, $6, $7, $8)) @returns Expression AsyncGeneratorExpression : `async` [no LineTerminator here] `function` `*` BindingIdentifier[+Yield, +Await]? `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}` => function_expr(async_function($0, $3, $4, $5, $6, $7, $8, $9)) @returns FunctionBody AsyncGeneratorBody : FunctionBody[+Yield, +Await] => $0 @returns Statement ClassDeclaration[Yield, Await, Default] : `class` BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await] => class_declaration($0, Some($1), $2) [+Default] `class` ClassTail[?Yield, ?Await] => class_declaration($0, None, $1) @returns Expression ClassExpression[Yield, Await] : `class` BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await] => class_expression($0, $1, $2) @returns ClassExpression ClassTail[Yield, Await] : ClassHeritage[?Yield, ?Await]? `{` ClassBody[?Yield, ?Await]? `}` => class_tail($0, $2, $3) @returns Expression ClassHeritage[Yield, Await] : `extends` LeftHandSideExpression[?Yield, ?Await] => $1 @returns Vec> ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] => $0 @returns Vec> ClassElementList[Yield, Await] : ClassElement[?Yield, ?Await] => $0 ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await] => class_element_list_append($0, $1) @returns ClassElement FieldDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] Initializer[+In, ~Yield, ~Await]? => class_field_definition($0, $1) @returns ClassElementName ClassElementName[Yield, Await] : PropertyName[?Yield, ?Await] => property_name_to_class_element_name($0) PrivateIdentifier => class_element_name_private($0) @returns Vec> ClassElement[Yield, Await] : MethodDefinition[?Yield, ?Await] => class_element($0) `static` MethodDefinition[?Yield, ?Await] => class_element_static($0, $1) FieldDefinition[?Yield, ?Await] `;` => class_element_to_vec($0) `static` FieldDefinition[?Yield, ?Await] `;` => class_element_static_field($0, $1) `;` => class_element_empty() @returns Statement AsyncFunctionDeclaration[Yield, Await, Default] : `async` [no LineTerminator here] `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}` => function_decl(async_function($0, Some($2), $3, $4, $5, $6, $7, $8)) [+Default] `async` [no LineTerminator here] `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}` => function_decl(async_function($0, None, $2, $3, $4, $5, $6, $7)) @returns Expression AsyncFunctionExpression : `async` [no LineTerminator here] `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}` => function_expr(async_function($0, None, $2, $3, $4, $5, $6, $7)) `async` [no LineTerminator here] `function` BindingIdentifier[~Yield, +Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}` => function_expr(async_function($0, Some($2), $3, $4, $5, $6, $7, $8)) @returns MethodDefinition AsyncMethod[Yield, Await] : `async` [no LineTerminator here] PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}` => async_method($0, $1, $2, $3, $4, $5, $6, $7) @returns FunctionBody AsyncFunctionBody : FunctionBody[~Yield, +Await] => $0 @returns Expression AwaitExpression[Yield] : `await` UnaryExpression[?Yield, +Await] => await_expr($0, $1) @returns Expression AsyncArrowFunction[In, Yield, Await] : `async` [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] `=>` AsyncConciseBody[?In] => async_arrow_function_bare($0, $1, $3) CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] `=>` AsyncConciseBody[?In] => async_arrow_function($0, $2) @returns ArrowExpressionBody AsyncConciseBody[In] : [lookahead != `{`] AssignmentExpression[?In, ~Yield, +Await] => concise_body_expression($0) `{` AsyncFunctionBody `}` => concise_body_block($0, $1, $2) @returns BindingIdentifier AsyncArrowBindingIdentifier[Yield] : BindingIdentifier[?Yield, +Await] => $0 @returns Expression CoverCallExpressionAndAsyncArrowHead[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] => call_expr($0, $1) AsyncArrowHead : `async` [no LineTerminator here] ArrowFormalParameters[~Yield, +Await] @returns Script Script : ScriptBody? => script($0) @returns Script ScriptBody : StatementList[~Yield, ~Await, ~Return] => script_body($0) @returns Vec Module : ModuleBody? => module($0) @returns Vec ModuleBody : ModuleItemList => $0 @returns Vec ModuleItemList : ModuleItem => module_item_list_single($0) ModuleItemList ModuleItem => module_item_list_append($0, $1) @returns Statement ModuleItem : ImportDeclaration => $0 ExportDeclaration => $0 StatementListItem[~Yield, ~Await, ~Return] => $0 @returns Statement ImportDeclaration : `import` ImportClause FromClause `;` => import_declaration(Some($1), $2) `import` ModuleSpecifier `;` => import_declaration(None, $1) @returns Void ImportClause : ImportedDefaultBinding => import_clause(Some($0), None, None) NameSpaceImport => import_clause(None, Some($0), None) NamedImports => import_clause(None, None, Some($0)) ImportedDefaultBinding `,` NameSpaceImport => import_clause(Some($0), Some($2), None) ImportedDefaultBinding `,` NamedImports => import_clause(Some($0), None, Some($2)) @returns BindingIdentifier ImportedDefaultBinding : ImportedBinding => $0 @returns Void NameSpaceImport : `*` `as` ImportedBinding => name_space_import($2) @returns Void NamedImports : `{` `}` => imports_list_empty() `{` ImportsList `}` => $1 `{` ImportsList `,` `}` => $1 @returns Token FromClause : `from` ModuleSpecifier => $1 @returns Void ImportsList : ImportSpecifier => imports_list_append(imports_list_empty(), $0) ImportsList `,` ImportSpecifier => imports_list_append($0, $2) @returns Void ImportSpecifier : ImportedBinding => import_specifier($0) IdentifierName `as` ImportedBinding => import_specifier_renaming($0, $2) @returns Token ModuleSpecifier : StringLiteral => module_specifier($0) @returns BindingIdentifier ImportedBinding : BindingIdentifier[~Yield, ~Await] => $0 @returns Statement ExportDeclaration : `export` `*` FromClause `;` => export_all_from($2) `export` ExportClause FromClause `;` => export_set_from($1, $2) `export` ExportClause `;` => export_set($1) `export` VariableStatement[~Yield, ~Await] => export_vars($1) `export` Declaration[~Yield, ~Await] => export_declaration($1) `export` `default` HoistableDeclaration[~Yield, ~Await, +Default] => export_default_hoistable($2) `export` `default` ClassDeclaration[~Yield, ~Await, +Default] => export_default_class($2) `export` `default` [lookahead export_default_value($2) @returns Void ExportClause : `{` `}` => exports_list_empty() `{` ExportsList `}` => $1 `{` ExportsList `,` `}` => $1 @returns Void ExportsList : ExportSpecifier => exports_list_append(exports_list_empty(), $0) ExportsList `,` ExportSpecifier => exports_list_append($0, $2) @returns Void ExportSpecifier : IdentifierName => export_specifier($0) IdentifierName `as` IdentifierName => export_specifier_renaming($0, $2)