A.2 Expressions
    
    IdentifierReference[Yield, Await] : 
        Identifier
    
    [~Yield]
        yield
    
    [~Await]
        await
    
    
    BindingIdentifier[Yield, Await] : 
        Identifier
    
    
        yield
    
    
        await
    
    
    LabelIdentifier[Yield, Await] : 
        Identifier
    
    [~Yield]
        yield
    
    [~Await]
        await
    
    
    Identifier : 
        IdentifierName but not ReservedWord
    
    
    PrimaryExpression[Yield, Await] : 
        this
    
    
        IdentifierReference[?Yield, ?Await]
    
    
        Literal
    
    
        ArrayLiteral[?Yield, ?Await]
    
    
        ObjectLiteral[?Yield, ?Await]
    
    
        FunctionExpression
    
    
        ClassExpression[?Yield, ?Await]
    
    
        GeneratorExpression
    
    
        AsyncFunctionExpression
    
    
        AsyncGeneratorExpression
    
    
        RegularExpressionLiteral
    
    
        TemplateLiteral[?Yield, ?Await, ~Tagged]
    
    
        CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
    
    
    CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : 
        (
        Expression[+In, ?Yield, ?Await]
        )
    
    
        (
        Expression[+In, ?Yield, ?Await]
        ,
        )
    
    
        (
        )
    
    
        (
        ...
        BindingIdentifier[?Yield, ?Await]
        )
    
    
        (
        ...
        BindingPattern[?Yield, ?Await]
        )
    
    
        (
        Expression[+In, ?Yield, ?Await]
        ,
        ...
        BindingIdentifier[?Yield, ?Await]
        )
    
    
        (
        Expression[+In, ?Yield, ?Await]
        ,
        ...
        BindingPattern[?Yield, ?Await]
        )
    
    
      When processing an instance of the production
      
    PrimaryExpression[Yield, Await] : 
        CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
    
      the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
    
    
    ParenthesizedExpression[Yield, Await] : 
        (
        Expression[+In, ?Yield, ?Await]
        )
    
     
    
    Literal : 
        NullLiteral
    
    
        BooleanLiteral
    
    
        NumericLiteral
    
    
        StringLiteral
    
    
    ArrayLiteral[Yield, Await] : 
        [
        Elisionopt
        ]
    
    
        [
        ElementList[?Yield, ?Await]
        ]
    
    
        [
        ElementList[?Yield, ?Await]
        ,
        Elisionopt
        ]
    
    
    ElementList[Yield, Await] : 
        Elisionopt
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        Elisionopt
        SpreadElement[?Yield, ?Await]
    
    
        ElementList[?Yield, ?Await]
        ,
        Elisionopt
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        ElementList[?Yield, ?Await]
        ,
        Elisionopt
        SpreadElement[?Yield, ?Await]
    
    
    Elision : 
        ,
    
    
        Elision
        ,
    
    
    SpreadElement[Yield, Await] : 
        ...
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
    ObjectLiteral[Yield, Await] : 
        {
        }
    
    
        {
        PropertyDefinitionList[?Yield, ?Await]
        }
    
    
        {
        PropertyDefinitionList[?Yield, ?Await]
        ,
        }
    
    
    PropertyDefinitionList[Yield, Await] : 
        PropertyDefinition[?Yield, ?Await]
    
    
        PropertyDefinitionList[?Yield, ?Await]
        ,
        PropertyDefinition[?Yield, ?Await]
    
    
    PropertyDefinition[Yield, Await] : 
        IdentifierReference[?Yield, ?Await]
    
    
        CoverInitializedName[?Yield, ?Await]
    
    
        PropertyName[?Yield, ?Await]
        :
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        MethodDefinition[?Yield, ?Await]
    
    
        ...
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
    PropertyName[Yield, Await] : 
        LiteralPropertyName
    
    
        ComputedPropertyName[?Yield, ?Await]
    
    
    LiteralPropertyName : 
        IdentifierName
    
    
        StringLiteral
    
    
        NumericLiteral
    
    
    ComputedPropertyName[Yield, Await] : 
        [
        AssignmentExpression[+In, ?Yield, ?Await]
        ]
    
    
    CoverInitializedName[Yield, Await] : 
        IdentifierReference[?Yield, ?Await]
        Initializer[+In, ?Yield, ?Await]
    
    
    Initializer[In, Yield, Await] : 
        =
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
    TemplateLiteral[Yield, Await, Tagged] : 
        NoSubstitutionTemplate
    
    
        SubstitutionTemplate[?Yield, ?Await, ?Tagged]
    
    
    SubstitutionTemplate[Yield, Await, Tagged] : 
        TemplateHead
        Expression[+In, ?Yield, ?Await]
        TemplateSpans[?Yield, ?Await, ?Tagged]
    
    
    TemplateSpans[Yield, Await, Tagged] : 
        TemplateTail
    
    
        TemplateMiddleList[?Yield, ?Await, ?Tagged]
        TemplateTail
    
    
    TemplateMiddleList[Yield, Await, Tagged] : 
        TemplateMiddle
        Expression[+In, ?Yield, ?Await]
    
    
        TemplateMiddleList[?Yield, ?Await, ?Tagged]
        TemplateMiddle
        Expression[+In, ?Yield, ?Await]
    
    
    MemberExpression[Yield, Await] : 
        PrimaryExpression[?Yield, ?Await]
    
    
        MemberExpression[?Yield, ?Await]
        [
        Expression[+In, ?Yield, ?Await]
        ]
    
    
        MemberExpression[?Yield, ?Await]
        .
        IdentifierName
    
    
        MemberExpression[?Yield, ?Await]
        TemplateLiteral[?Yield, ?Await, +Tagged]
    
    
        SuperProperty[?Yield, ?Await]
    
    
        MetaProperty
    
    
        new
        MemberExpression[?Yield, ?Await]
        Arguments[?Yield, ?Await]
    
    
        MemberExpression[?Yield, ?Await]
        .
        PrivateIdentifier
    
    
    SuperProperty[Yield, Await] : 
        super
        [
        Expression[+In, ?Yield, ?Await]
        ]
    
    
        super
        .
        IdentifierName
    
    
    MetaProperty : 
        NewTarget
    
    
        ImportMeta
    
    
    NewTarget : 
        new
        .
        target
    
    
    ImportMeta : 
        import
        .
        meta
    
    
    NewExpression[Yield, Await] : 
        MemberExpression[?Yield, ?Await]
    
    
        new
        NewExpression[?Yield, ?Await]
    
    
    CallExpression[Yield, Await] : 
        CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
    
    
        SuperCall[?Yield, ?Await]
    
    
        ImportCall[?Yield, ?Await]
    
    
        CallExpression[?Yield, ?Await]
        Arguments[?Yield, ?Await]
    
    
        CallExpression[?Yield, ?Await]
        [
        Expression[+In, ?Yield, ?Await]
        ]
    
    
        CallExpression[?Yield, ?Await]
        .
        IdentifierName
    
    
        CallExpression[?Yield, ?Await]
        TemplateLiteral[?Yield, ?Await, +Tagged]
    
    
        CallExpression[?Yield, ?Await]
        .
        PrivateIdentifier
    
    
      When processing an instance of the production
      
    CallExpression[Yield, Await] : 
        CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
    
      the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
    
    
    CallMemberExpression[Yield, Await] : 
        MemberExpression[?Yield, ?Await]
        Arguments[?Yield, ?Await]
    
     
    
    SuperCall[Yield, Await] : 
        super
        Arguments[?Yield, ?Await]
    
    
    ImportCall[Yield, Await] : 
        import
        (
        AssignmentExpression[+In, ?Yield, ?Await]
        ,opt
        )
    
    
        import
        (
        AssignmentExpression[+In, ?Yield, ?Await]
        ,
        AssignmentExpression[+In, ?Yield, ?Await]
        ,opt
        )
    
    
    Arguments[Yield, Await] : 
        (
        )
    
    
        (
        ArgumentList[?Yield, ?Await]
        )
    
    
        (
        ArgumentList[?Yield, ?Await]
        ,
        )
    
    
    ArgumentList[Yield, Await] : 
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        ...
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        ArgumentList[?Yield, ?Await]
        ,
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
        ArgumentList[?Yield, ?Await]
        ,
        ...
        AssignmentExpression[+In, ?Yield, ?Await]
    
    
    OptionalExpression[Yield, Await] : 
        MemberExpression[?Yield, ?Await]
        OptionalChain[?Yield, ?Await]
    
    
        CallExpression[?Yield, ?Await]
        OptionalChain[?Yield, ?Await]
    
    
        OptionalExpression[?Yield, ?Await]
        OptionalChain[?Yield, ?Await]
    
    
    OptionalChain[Yield, Await] : 
        ?.
        Arguments[?Yield, ?Await]
    
    
        ?.
        [
        Expression[+In, ?Yield, ?Await]
        ]
    
    
        ?.
        IdentifierName
    
    
        ?.
        TemplateLiteral[?Yield, ?Await, +Tagged]
    
    
        ?.
        PrivateIdentifier
    
    
        OptionalChain[?Yield, ?Await]
        Arguments[?Yield, ?Await]
    
    
        OptionalChain[?Yield, ?Await]
        [
        Expression[+In, ?Yield, ?Await]
        ]
    
    
        OptionalChain[?Yield, ?Await]
        .
        IdentifierName
    
    
        OptionalChain[?Yield, ?Await]
        TemplateLiteral[?Yield, ?Await, +Tagged]
    
    
        OptionalChain[?Yield, ?Await]
        .
        PrivateIdentifier
    
    
    LeftHandSideExpression[Yield, Await] : 
        NewExpression[?Yield, ?Await]
    
    
        CallExpression[?Yield, ?Await]
    
    
        OptionalExpression[?Yield, ?Await]
    
    
    UpdateExpression[Yield, Await] : 
        LeftHandSideExpression[?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        [no LineTerminator here]
        ++
    
    
        LeftHandSideExpression[?Yield, ?Await]
        [no LineTerminator here]
        --
    
    
        ++
        UnaryExpression[?Yield, ?Await]
    
    
        --
        UnaryExpression[?Yield, ?Await]
    
    
    UnaryExpression[Yield, Await] : 
        UpdateExpression[?Yield, ?Await]
    
    
        delete
        UnaryExpression[?Yield, ?Await]
    
    
        void
        UnaryExpression[?Yield, ?Await]
    
    
        typeof
        UnaryExpression[?Yield, ?Await]
    
    
        +
        UnaryExpression[?Yield, ?Await]
    
    
        -
        UnaryExpression[?Yield, ?Await]
    
    
        ~
        UnaryExpression[?Yield, ?Await]
    
    
        !
        UnaryExpression[?Yield, ?Await]
    
    [+Await]
        AwaitExpression[?Yield]
    
    
    ExponentiationExpression[Yield, Await] : 
        UnaryExpression[?Yield, ?Await]
    
    
        UpdateExpression[?Yield, ?Await]
        **
        ExponentiationExpression[?Yield, ?Await]
    
    
    MultiplicativeExpression[Yield, Await] : 
        ExponentiationExpression[?Yield, ?Await]
    
    
        MultiplicativeExpression[?Yield, ?Await]
        MultiplicativeOperator
        ExponentiationExpression[?Yield, ?Await]
    
    
    MultiplicativeOperator : one of * / %
    
    AdditiveExpression[Yield, Await] : 
        MultiplicativeExpression[?Yield, ?Await]
    
    
        AdditiveExpression[?Yield, ?Await]
        +
        MultiplicativeExpression[?Yield, ?Await]
    
    
        AdditiveExpression[?Yield, ?Await]
        -
        MultiplicativeExpression[?Yield, ?Await]
    
    
    ShiftExpression[Yield, Await] : 
        AdditiveExpression[?Yield, ?Await]
    
    
        ShiftExpression[?Yield, ?Await]
        <<
        AdditiveExpression[?Yield, ?Await]
    
    
        ShiftExpression[?Yield, ?Await]
        >>
        AdditiveExpression[?Yield, ?Await]
    
    
        ShiftExpression[?Yield, ?Await]
        >>>
        AdditiveExpression[?Yield, ?Await]
    
    
    RelationalExpression[In, Yield, Await] : 
        ShiftExpression[?Yield, ?Await]
    
    
        RelationalExpression[?In, ?Yield, ?Await]
        <
        ShiftExpression[?Yield, ?Await]
    
    
        RelationalExpression[?In, ?Yield, ?Await]
        >
        ShiftExpression[?Yield, ?Await]
    
    
        RelationalExpression[?In, ?Yield, ?Await]
        <=
        ShiftExpression[?Yield, ?Await]
    
    
        RelationalExpression[?In, ?Yield, ?Await]
        >=
        ShiftExpression[?Yield, ?Await]
    
    
        RelationalExpression[?In, ?Yield, ?Await]
        instanceof
        ShiftExpression[?Yield, ?Await]
    
    [+In]
        RelationalExpression[+In, ?Yield, ?Await]
        in
        ShiftExpression[?Yield, ?Await]
    
    [+In]
        PrivateIdentifier
        in
        ShiftExpression[?Yield, ?Await]
    
    
    EqualityExpression[In, Yield, Await] : 
        RelationalExpression[?In, ?Yield, ?Await]
    
    
        EqualityExpression[?In, ?Yield, ?Await]
        ==
        RelationalExpression[?In, ?Yield, ?Await]
    
    
        EqualityExpression[?In, ?Yield, ?Await]
        !=
        RelationalExpression[?In, ?Yield, ?Await]
    
    
        EqualityExpression[?In, ?Yield, ?Await]
        ===
        RelationalExpression[?In, ?Yield, ?Await]
    
    
        EqualityExpression[?In, ?Yield, ?Await]
        !==
        RelationalExpression[?In, ?Yield, ?Await]
    
    
    BitwiseANDExpression[In, Yield, Await] : 
        EqualityExpression[?In, ?Yield, ?Await]
    
    
        BitwiseANDExpression[?In, ?Yield, ?Await]
        &
        EqualityExpression[?In, ?Yield, ?Await]
    
    
    BitwiseXORExpression[In, Yield, Await] : 
        BitwiseANDExpression[?In, ?Yield, ?Await]
    
    
        BitwiseXORExpression[?In, ?Yield, ?Await]
        ^
        BitwiseANDExpression[?In, ?Yield, ?Await]
    
    
    BitwiseORExpression[In, Yield, Await] : 
        BitwiseXORExpression[?In, ?Yield, ?Await]
    
    
        BitwiseORExpression[?In, ?Yield, ?Await]
        |
        BitwiseXORExpression[?In, ?Yield, ?Await]
    
    
    LogicalANDExpression[In, Yield, Await] : 
        BitwiseORExpression[?In, ?Yield, ?Await]
    
    
        LogicalANDExpression[?In, ?Yield, ?Await]
        &&
        BitwiseORExpression[?In, ?Yield, ?Await]
    
    
    LogicalORExpression[In, Yield, Await] : 
        LogicalANDExpression[?In, ?Yield, ?Await]
    
    
        LogicalORExpression[?In, ?Yield, ?Await]
        ||
        LogicalANDExpression[?In, ?Yield, ?Await]
    
    
    CoalesceExpression[In, Yield, Await] : 
        CoalesceExpressionHead[?In, ?Yield, ?Await]
        ??
        BitwiseORExpression[?In, ?Yield, ?Await]
    
    
    CoalesceExpressionHead[In, Yield, Await] : 
        CoalesceExpression[?In, ?Yield, ?Await]
    
    
        BitwiseORExpression[?In, ?Yield, ?Await]
    
    
    ShortCircuitExpression[In, Yield, Await] : 
        LogicalORExpression[?In, ?Yield, ?Await]
    
    
        CoalesceExpression[?In, ?Yield, ?Await]
    
    
    ConditionalExpression[In, Yield, Await] : 
        ShortCircuitExpression[?In, ?Yield, ?Await]
    
    
        ShortCircuitExpression[?In, ?Yield, ?Await]
        ?
        AssignmentExpression[+In, ?Yield, ?Await]
        :
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
    AssignmentExpression[In, Yield, Await] : 
        ConditionalExpression[?In, ?Yield, ?Await]
    
    [+Yield]
        YieldExpression[?In, ?Await]
    
    
        ArrowFunction[?In, ?Yield, ?Await]
    
    
        AsyncArrowFunction[?In, ?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        =
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        AssignmentOperator
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        &&=
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        ||=
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
        LeftHandSideExpression[?Yield, ?Await]
        ??=
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
    AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=
    
      In certain circumstances when processing an instance of the production
      
    AssignmentExpression[In, Yield, Await] : 
        LeftHandSideExpression[?Yield, ?Await]
        =
        AssignmentExpression[?In, ?Yield, ?Await]
    
      the interpretation of LeftHandSideExpression is refined using the following grammar:
    
    
    AssignmentPattern[Yield, Await] : 
        ObjectAssignmentPattern[?Yield, ?Await]
    
    
        ArrayAssignmentPattern[?Yield, ?Await]
    
    
    ObjectAssignmentPattern[Yield, Await] : 
        {
        }
    
    
        {
        AssignmentRestProperty[?Yield, ?Await]
        }
    
    
        {
        AssignmentPropertyList[?Yield, ?Await]
        }
    
    
        {
        AssignmentPropertyList[?Yield, ?Await]
        ,
        AssignmentRestProperty[?Yield, ?Await]opt
        }
    
    
    ArrayAssignmentPattern[Yield, Await] : 
        [
        Elisionopt
        AssignmentRestElement[?Yield, ?Await]opt
        ]
    
    
        [
        AssignmentElementList[?Yield, ?Await]
        ]
    
    
        [
        AssignmentElementList[?Yield, ?Await]
        ,
        Elisionopt
        AssignmentRestElement[?Yield, ?Await]opt
        ]
    
    
    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] : 
        Elisionopt
        AssignmentElement[?Yield, ?Await]
    
    
    AssignmentProperty[Yield, Await] : 
        IdentifierReference[?Yield, ?Await]
        Initializer[+In, ?Yield, ?Await]opt
    
    
        PropertyName[?Yield, ?Await]
        :
        AssignmentElement[?Yield, ?Await]
    
    
    AssignmentElement[Yield, Await] : 
        DestructuringAssignmentTarget[?Yield, ?Await]
        Initializer[+In, ?Yield, ?Await]opt
    
    
    AssignmentRestElement[Yield, Await] : 
        ...
        DestructuringAssignmentTarget[?Yield, ?Await]
    
    
    DestructuringAssignmentTarget[Yield, Await] : 
        LeftHandSideExpression[?Yield, ?Await]
    
     
    
    Expression[In, Yield, Await] : 
        AssignmentExpression[?In, ?Yield, ?Await]
    
    
        Expression[?In, ?Yield, ?Await]
        ,
        AssignmentExpression[?In, ?Yield, ?Await]