A.2 Expressions
IdentifierReference[Yield, Await]:Identifier[~Yield]yield[~Await]awaitBindingIdentifier[Yield, Await]:IdentifieryieldawaitLabelIdentifier[Yield, Await]:Identifier[~Yield]yield[~Await]awaitIdentifier:IdentifierNamebut notReservedWordPrimaryExpression[Yield, Await]:thisIdentifierReference[?Yield, ?Await]LiteralArrayLiteral[?Yield, ?Await]ObjectLiteral[?Yield, ?Await]FunctionExpressionClassExpression[?Yield, ?Await]GeneratorExpressionAsyncFunctionExpressionAsyncGeneratorExpressionRegularExpressionLiteralTemplateLiteral[?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 ofCoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:
ParenthesizedExpression[Yield, Await]:(Expression[+In, ?Yield, ?Await])
Literal:NullLiteralBooleanLiteralNumericLiteralStringLiteralArrayLiteral[Yield, Await]:[Elisionopt][ElementList[?Yield, ?Await]][ElementList[?Yield, ?Await],Elisionopt]ElementList[Yield, Await]:ElisionoptAssignmentExpression[+In, ?Yield, ?Await]ElisionoptSpreadElement[?Yield, ?Await]ElementList[?Yield, ?Await],ElisionoptAssignmentExpression[+In, ?Yield, ?Await]ElementList[?Yield, ?Await],ElisionoptSpreadElement[?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]:LiteralPropertyNameComputedPropertyName[?Yield, ?Await]LiteralPropertyName:IdentifierNameStringLiteralNumericLiteralComputedPropertyName[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]:NoSubstitutionTemplateSubstitutionTemplate[?Yield, ?Await, ?Tagged]SubstitutionTemplate[Yield, Await, Tagged]:TemplateHeadExpression[+In, ?Yield, ?Await]TemplateSpans[?Yield, ?Await, ?Tagged]TemplateSpans[Yield, Await, Tagged]:TemplateTailTemplateMiddleList[?Yield, ?Await, ?Tagged]TemplateTailTemplateMiddleList[Yield, Await, Tagged]:TemplateMiddleExpression[+In, ?Yield, ?Await]TemplateMiddleList[?Yield, ?Await, ?Tagged]TemplateMiddleExpression[+In, ?Yield, ?Await]MemberExpression[Yield, Await]:PrimaryExpression[?Yield, ?Await]MemberExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]]MemberExpression[?Yield, ?Await].IdentifierNameMemberExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await, +Tagged]SuperProperty[?Yield, ?Await]MetaPropertynewMemberExpression[?Yield, ?Await]Arguments[?Yield, ?Await]MemberExpression[?Yield, ?Await].PrivateIdentifierSuperProperty[Yield, Await]:super[Expression[+In, ?Yield, ?Await]]super.IdentifierNameMetaProperty:NewTargetImportMetaNewTarget:new.targetImportMeta:import.metaNewExpression[Yield, Await]:MemberExpression[?Yield, ?Await]newNewExpression[?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].IdentifierNameCallExpression[?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 ofCoverCallExpressionAndAsyncArrowHead is refined using the following grammar:
CallMemberExpression[Yield, Await]:MemberExpression[?Yield, ?Await]Arguments[?Yield, ?Await]
SuperCall[Yield, Await]:superArguments[?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]?.PrivateIdentifierOptionalChain[?Yield, ?Await]Arguments[?Yield, ?Await]OptionalChain[?Yield, ?Await][Expression[+In, ?Yield, ?Await]]OptionalChain[?Yield, ?Await].IdentifierNameOptionalChain[?Yield, ?Await]TemplateLiteral[?Yield, ?Await, +Tagged]OptionalChain[?Yield, ?Await].PrivateIdentifierLeftHandSideExpression[Yield, Await]:NewExpression[?Yield, ?Await]CallExpression[?Yield, ?Await]OptionalExpression[?Yield, ?Await]UpdateExpression[Yield, Await]:LeftHandSideExpression[?Yield, ?Await]LeftHandSideExpression[?Yield, ?Await][noLineTerminator here]++LeftHandSideExpression[?Yield, ?Await][noLineTerminator here]--++UnaryExpression[?Yield, ?Await]--UnaryExpression[?Yield, ?Await]UnaryExpression[Yield, Await]:UpdateExpression[?Yield, ?Await]deleteUnaryExpression[?Yield, ?Await]voidUnaryExpression[?Yield, ?Await]typeofUnaryExpression[?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]MultiplicativeOperatorExponentiationExpression[?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]instanceofShiftExpression[?Yield, ?Await][+In]RelationalExpression[+In, ?Yield, ?Await]inShiftExpression[?Yield, ?Await][+In]PrivateIdentifierinShiftExpression[?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]AssignmentOperatorAssignmentExpression[?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 ofLeftHandSideExpression 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]:[ElisionoptAssignmentRestElement[?Yield, ?Await]opt][AssignmentElementList[?Yield, ?Await]][AssignmentElementList[?Yield, ?Await],ElisionoptAssignmentRestElement[?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]:ElisionoptAssignmentElement[?Yield, ?Await]AssignmentProperty[Yield, Await]:IdentifierReference[?Yield, ?Await]Initializer[+In, ?Yield, ?Await]optPropertyName[?Yield, ?Await]:AssignmentElement[?Yield, ?Await]AssignmentElement[Yield, Await]:DestructuringAssignmentTarget[?Yield, ?Await]Initializer[+In, ?Yield, ?Await]optAssignmentRestElement[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]