このページはECMAScript® 2020 Language SpecificationA Grammar Summary章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

A.1 レキシカル文法(Lexical Grammar)

SourceCharacter ::

any Unicode code point
WhiteSpace ::

<TAB>
<VT>
<FF>
<SP>
<NBSP>
<ZWNBSP>
<USP>
LineTerminator ::

<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::

<LF>
<CR>[lookahead ≠ <LF>]
<LS>
<PS>
<CR><LF>
UnicodeIDStart ::

any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::

any Unicode code point with the Unicode property “ID_Continue”
ReservedWord :: one of

awaitbreakcasecatchclassconstcontinuedebuggerdefaultdeletedoelseenumexportextendsfalsefinallyforfunctionifimportininstanceofnewnullreturnsuperswitchthisthrowtruetrytypeofvarvoidwhilewithyield
OtherPunctuator :: one of

{()[]....;,<><=>===!====!==+-*%**++--<<>>>>>&|^!~&&||???:=+=-=*=%=**=<<=>>=>>>=&=|=^==>
DivPunctuator ::

/
/=
NullLiteral ::

null
BooleanLiteral ::

true
false
DecimalDigit :: one of

0123456789
NonZeroDigit :: one of

123456789
ExponentIndicator :: one of

eE
BinaryDigit :: one of

01
OctalDigit :: one of

01234567
HexDigit :: one of

0123456789abcdefABCDEF
SingleEscapeCharacter :: one of

'"\bfnrtv
NotEscapeSequence ::

x[lookahead ∉ HexDigit ]
xHexDigit [lookahead ∉ HexDigit ]
u[lookahead ∉ HexDigit ][lookahead ≠ {]
uHexDigit [lookahead ∉ HexDigit ]
uHexDigit HexDigit [lookahead ∉ HexDigit ]
u{[lookahead ∉ HexDigit ]
u{NotCodePoint [lookahead ∉ HexDigit ]
u{CodePoint [lookahead ∉ HexDigit ][lookahead ≠ }]
NotCodePoint ::

HexDigits HexDigitsMV > 0x10FFFF
CodePoint ::

HexDigits HexDigitsMV ≦ 0x10FFFF

A.2 式(Expressions)

IdentifierReference[Yield, Await] :

[~Yield]yield
[~Await]await
BindingIdentifier[Yield, Await] :

yield
await
LabelIdentifier[Yield, Await] :

[~Yield]yield
[~Await]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] )

次のプロダクションのインスタンスを処理するとき

CoverParenthesizedExpressionAndArrowParameterListの解釈は、次の文法を使用して改善されます。

ParenthesizedExpression[Yield, Await] :

(Expression[+In, ?Yield, ?Await] )
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]
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] :

ComputedPropertyName[?Yield, ?Await]
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] :

SubstitutionTemplate[?Yield, ?Await, ?Tagged]
SubstitutionTemplate[Yield, Await, Tagged] :

TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
TemplateSpans[Yield, Await, Tagged] :

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] TemplateLiteral[?Yield, ?Await, +Tagged]
SuperProperty[?Yield, ?Await]
newMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperProperty[Yield, Await] :

super[Expression[+In, ?Yield, ?Await] ]
NewTarget :

new.target
ImportMeta :

import.meta
NewExpression[Yield, Await] :

MemberExpression[?Yield, ?Await]
newNewExpression[?Yield, ?Await]
CallExpression[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] :

CoverCallExpressionAndAsyncArrowHead の解釈は、次の文法を使用して改善されます。

CallMemberExpression[Yield, Await] :

MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperCall[Yield, Await] :

superArguments[?Yield, ?Await]
ImportCall[Yield, Await] :

import(AssignmentExpression[+In, ?Yield, ?Await] )
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] ]
?.TemplateLiteral[?Yield, ?Await, +Tagged]
OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await]
OptionalChain[?Yield, ?Await] [Expression[+In, ?Yield, ?Await] ]
OptionalChain[?Yield, ?Await] .IdentifierName
OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
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]
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]
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]
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]
AssignmentOperator : one of

*=/=%=+=-=<<=>>=>>>=&=^=|=**=

次のプロダクションのインスタンスを処理するときの特定の状況において、

AssignmentExpression[In, Yield, Await] :

LeftHandSideExpression[?Yield, ?Await] =AssignmentExpression[?In, ?Yield, ?Await]

LeftHandSideExpression の解釈は、次の文法を使用して改善されます。

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] :

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] :

LeftHandSideExpression[?Yield, ?Await]
Expression[In, Yield, Await] :

AssignmentExpression[?In, ?Yield, ?Await]
Expression[?In, ?Yield, ?Await] ,AssignmentExpression[?In, ?Yield, ?Await]

A.3 ステートメント(Statements)

Statement[Yield, Await, Return] :

BlockStatement[?Yield, ?Await, ?Return]
VariableStatement[?Yield, ?Await]
ExpressionStatement[?Yield, ?Await]
IfStatement[?Yield, ?Await, ?Return]
BreakableStatement[?Yield, ?Await, ?Return]
ContinueStatement[?Yield, ?Await]
BreakStatement[?Yield, ?Await]
[+Return]ReturnStatement[?Yield, ?Await]
WithStatement[?Yield, ?Await, ?Return]
LabelledStatement[?Yield, ?Await, ?Return]
ThrowStatement[?Yield, ?Await]
TryStatement[?Yield, ?Await, ?Return]
Declaration[Yield, Await] :

HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LexicalDeclaration[+In, ?Yield, ?Await]
HoistableDeclaration[Yield, Await, Default] :

FunctionDeclaration[?Yield, ?Await, ?Default]
GeneratorDeclaration[?Yield, ?Await, ?Default]
AsyncFunctionDeclaration[?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration[?Yield, ?Await, ?Default]
BreakableStatement[Yield, Await, Return] :

IterationStatement[?Yield, ?Await, ?Return]
SwitchStatement[?Yield, ?Await, ?Return]
BlockStatement[Yield, Await, Return] :

Block[?Yield, ?Await, ?Return]
Block[Yield, Await, Return] :

{StatementList[?Yield, ?Await, ?Return]opt }
StatementList[Yield, Await, Return] :

StatementListItem[?Yield, ?Await, ?Return]
StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return]
StatementListItem[Yield, Await, Return] :

Statement[?Yield, ?Await, ?Return]
Declaration[?Yield, ?Await]
LexicalDeclaration[In, Yield, Await] :

LetOrConst BindingList[?In, ?Yield, ?Await] ;
LetOrConst :

let
const
BindingList[In, Yield, Await] :

LexicalBinding[?In, ?Yield, ?Await]
BindingList[?In, ?Yield, ?Await] ,LexicalBinding[?In, ?Yield, ?Await]
LexicalBinding[In, Yield, Await] :

BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
VariableStatement[Yield, Await] :

varVariableDeclarationList[+In, ?Yield, ?Await] ;
VariableDeclarationList[In, Yield, Await] :

VariableDeclaration[?In, ?Yield, ?Await]
VariableDeclarationList[?In, ?Yield, ?Await] ,VariableDeclaration[?In, ?Yield, ?Await]
VariableDeclaration[In, Yield, Await] :

BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
BindingPattern[Yield, Await] :

ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?Yield, ?Await]
ObjectBindingPattern[Yield, Await] :

{}
{BindingRestProperty[?Yield, ?Await] }
{BindingPropertyList[?Yield, ?Await] }
{BindingPropertyList[?Yield, ?Await] ,BindingRestProperty[?Yield, ?Await]opt }
ArrayBindingPattern[Yield, Await] :

[Elisionopt BindingRestElement[?Yield, ?Await]opt ]
[BindingElementList[?Yield, ?Await] ]
[BindingElementList[?Yield, ?Await] ,Elisionopt BindingRestElement[?Yield, ?Await]opt ]
BindingRestProperty[Yield, Await] :

...BindingIdentifier[?Yield, ?Await]
BindingPropertyList[Yield, Await] :

BindingProperty[?Yield, ?Await]
BindingPropertyList[?Yield, ?Await] ,BindingProperty[?Yield, ?Await]
BindingElementList[Yield, Await] :

BindingElisionElement[?Yield, ?Await]
BindingElementList[?Yield, ?Await] ,BindingElisionElement[?Yield, ?Await]
BindingElisionElement[Yield, Await] :

Elisionopt BindingElement[?Yield, ?Await]
BindingProperty[Yield, Await] :

SingleNameBinding[?Yield, ?Await]
PropertyName[?Yield, ?Await] :BindingElement[?Yield, ?Await]
BindingElement[Yield, Await] :

SingleNameBinding[?Yield, ?Await]
BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
SingleNameBinding[Yield, Await] :

BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
BindingRestElement[Yield, Await] :

...BindingIdentifier[?Yield, ?Await]
...BindingPattern[?Yield, ?Await]
ExpressionStatement[Yield, Await] :

[lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }]Expression[+In, ?Yield, ?Await] ;
IfStatement[Yield, Await, Return] :

if(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return] elseStatement[?Yield, ?Await, ?Return]
if(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
IterationStatement[Yield, Await, Return] :

doStatement[?Yield, ?Await, ?Return] while(Expression[+In, ?Yield, ?Await] );
while(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for([lookahead ≠ let []Expression[~In, ?Yield, ?Await]opt ;Expression[+In, ?Yield, ?Await]opt ;Expression[+In, ?Yield, ?Await]opt )Statement[?Yield, ?Await, ?Return]
for(varVariableDeclarationList[~In, ?Yield, ?Await] ;Expression[+In, ?Yield, ?Await]opt ;Expression[+In, ?Yield, ?Await]opt )Statement[?Yield, ?Await, ?Return]
for(LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ;Expression[+In, ?Yield, ?Await]opt )Statement[?Yield, ?Await, ?Return]
for([lookahead ≠ let []LeftHandSideExpression[?Yield, ?Await] inExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for(varForBinding[?Yield, ?Await] inExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for(ForDeclaration[?Yield, ?Await] inExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for([lookahead ≠ let]LeftHandSideExpression[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for(varForBinding[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
for(ForDeclaration[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
[+Await]forawait([lookahead ≠ let]LeftHandSideExpression[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
[+Await]forawait(varForBinding[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
[+Await]forawait(ForDeclaration[?Yield, ?Await] ofAssignmentExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
ForDeclaration[Yield, Await] :

LetOrConst ForBinding[?Yield, ?Await]
ForBinding[Yield, Await] :

BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
ContinueStatement[Yield, Await] :

continue;
continue[no LineTerminator here]LabelIdentifier[?Yield, ?Await] ;
BreakStatement[Yield, Await] :

break;
break[no LineTerminator here]LabelIdentifier[?Yield, ?Await] ;
ReturnStatement[Yield, Await] :

return;
return[no LineTerminator here]Expression[+In, ?Yield, ?Await] ;
WithStatement[Yield, Await, Return] :

with(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
SwitchStatement[Yield, Await, Return] :

switch(Expression[+In, ?Yield, ?Await] )CaseBlock[?Yield, ?Await, ?Return]
CaseBlock[Yield, Await, Return] :

{CaseClauses[?Yield, ?Await, ?Return]opt }
{CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt }
CaseClauses[Yield, Await, Return] :

CaseClause[?Yield, ?Await, ?Return]
CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return]
CaseClause[Yield, Await, Return] :

caseExpression[+In, ?Yield, ?Await] :StatementList[?Yield, ?Await, ?Return]opt
DefaultClause[Yield, Await, Return] :

default:StatementList[?Yield, ?Await, ?Return]opt
LabelledStatement[Yield, Await, Return] :

LabelIdentifier[?Yield, ?Await] :LabelledItem[?Yield, ?Await, ?Return]
LabelledItem[Yield, Await, Return] :

Statement[?Yield, ?Await, ?Return]
FunctionDeclaration[?Yield, ?Await, ~Default]
ThrowStatement[Yield, Await] :

throw[no LineTerminator here]Expression[+In, ?Yield, ?Await] ;
TryStatement[Yield, Await, Return] :

tryBlock[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return]
tryBlock[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
tryBlock[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
Catch[Yield, Await, Return] :

catch(CatchParameter[?Yield, ?Await] )Block[?Yield, ?Await, ?Return]
catchBlock[?Yield, ?Await, ?Return]
Finally[Yield, Await, Return] :

finallyBlock[?Yield, ?Await, ?Return]
CatchParameter[Yield, Await] :

BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
DebuggerStatement :

debugger;

A.4 関数とクラス(Functions and Classes)

FunctionDeclaration[Yield, Await, Default] :

functionBindingIdentifier[?Yield, ?Await] (FormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
[+Default]function(FormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
FunctionExpression :

functionBindingIdentifier[~Yield, ~Await]opt (FormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
UniqueFormalParameters[Yield, Await] :

FormalParameters[?Yield, ?Await]
FormalParameters[Yield, Await] :

FunctionRestParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await]
FormalParameterList[?Yield, ?Await] ,
FormalParameterList[?Yield, ?Await] ,FunctionRestParameter[?Yield, ?Await]
FormalParameterList[Yield, Await] :

FormalParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await] ,FormalParameter[?Yield, ?Await]
FunctionRestParameter[Yield, Await] :

BindingRestElement[?Yield, ?Await]
FormalParameter[Yield, Await] :

BindingElement[?Yield, ?Await]
FunctionBody[Yield, Await] :

FunctionStatementList[?Yield, ?Await]
FunctionStatementList[Yield, Await] :

StatementList[?Yield, ?Await, +Return]opt
ArrowFunction[In, Yield, Await] :

ArrowParameters[?Yield, ?Await] [no LineTerminator here]=>ConciseBody[?In]
ConciseBody[In] :

[lookahead{]ExpressionBody[?In, ~Await]
{FunctionBody[~Yield, ~Await] }
ExpressionBody[In, Await] :

AssignmentExpression[?In, ~Yield, ?Await]

次のプロダクションのとき、

次のプロダクションは、 CoverParenthesizedExpressionAndArrowParameterList の解釈を改善するために使用されます。

ArrowFormalParameters[Yield, Await] :

(UniqueFormalParameters[?Yield, ?Await] )

次のプロダクションのとき、

AsyncArrowFunction[In, Yield, Await] :

次のプロダクションは、 CoverCallExpressionAndAsyncArrowHead の解釈を改善するために使用されます。

AsyncArrowHead :

async[no LineTerminator here]ArrowFormalParameters[~Yield, +Await]
MethodDefinition[Yield, Await] :

PropertyName[?Yield, ?Await] (UniqueFormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
GeneratorMethod[?Yield, ?Await]
AsyncMethod[?Yield, ?Await]
AsyncGeneratorMethod[?Yield, ?Await]
getPropertyName[?Yield, ?Await] (){FunctionBody[~Yield, ~Await] }
setPropertyName[?Yield, ?Await] (PropertySetParameterList ){FunctionBody[~Yield, ~Await] }
GeneratorMethod[Yield, Await] :

*PropertyName[?Yield, ?Await] (UniqueFormalParameters[+Yield, ~Await] ){GeneratorBody }
GeneratorDeclaration[Yield, Await, Default] :

function*BindingIdentifier[?Yield, ?Await] (FormalParameters[+Yield, ~Await] ){GeneratorBody }
[+Default]function*(FormalParameters[+Yield, ~Await] ){GeneratorBody }
GeneratorExpression :

function*BindingIdentifier[+Yield, ~Await]opt (FormalParameters[+Yield, ~Await] ){GeneratorBody }
GeneratorBody :

FunctionBody[+Yield, ~Await]
YieldExpression[In, Await] :

yield
yield[no LineTerminator here]AssignmentExpression[?In, +Yield, ?Await]
yield[no LineTerminator here]*AssignmentExpression[?In, +Yield, ?Await]
AsyncGeneratorMethod[Yield, Await] :

async[no LineTerminator here]*PropertyName[?Yield, ?Await] (UniqueFormalParameters[+Yield, +Await] ){AsyncGeneratorBody }
AsyncGeneratorDeclaration[Yield, Await, Default] :

async[no LineTerminator here]function*BindingIdentifier[?Yield, ?Await] (FormalParameters[+Yield, +Await] ){AsyncGeneratorBody }
[+Default]async[no LineTerminator here]function*(FormalParameters[+Yield, +Await] ){AsyncGeneratorBody }
AsyncGeneratorExpression :

async[no LineTerminator here]function*BindingIdentifier[+Yield, +Await]opt (FormalParameters[+Yield, +Await] ){AsyncGeneratorBody }
AsyncGeneratorBody :

FunctionBody[+Yield, +Await]
AsyncFunctionDeclaration[Yield, Await, Default] :

async[no LineTerminator here]functionBindingIdentifier[?Yield, ?Await] (FormalParameters[~Yield, +Await] ){AsyncFunctionBody }
[+Default]async[no LineTerminator here]function(FormalParameters[~Yield, +Await] ){AsyncFunctionBody }
AsyncFunctionExpression :

async[no LineTerminator here]function(FormalParameters[~Yield, +Await] ){AsyncFunctionBody }
async[no LineTerminator here]functionBindingIdentifier[~Yield, +Await] (FormalParameters[~Yield, +Await] ){AsyncFunctionBody }
AsyncMethod[Yield, Await] :

async[no LineTerminator here]PropertyName[?Yield, ?Await] (UniqueFormalParameters[~Yield, +Await] ){AsyncFunctionBody }
AsyncFunctionBody :

FunctionBody[~Yield, +Await]
AwaitExpression[Yield] :

awaitUnaryExpression[?Yield, +Await]
ClassDeclaration[Yield, Await, Default] :

classBindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
[+Default]classClassTail[?Yield, ?Await]
ClassExpression[Yield, Await] :

classBindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
ClassTail[Yield, Await] :

ClassHeritage[?Yield, ?Await]opt {ClassBody[?Yield, ?Await]opt }
ClassHeritage[Yield, Await] :

extendsLeftHandSideExpression[?Yield, ?Await]
ClassBody[Yield, Await] :

ClassElementList[?Yield, ?Await]
ClassElementList[Yield, Await] :

ClassElement[?Yield, ?Await]
ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await]
ClassElement[Yield, Await] :

MethodDefinition[?Yield, ?Await]
staticMethodDefinition[?Yield, ?Await]
;

A.5 スクリプトとモジュール(Scripts and Modules)

ScriptBody :

StatementList[~Yield, ~Await, ~Return]
ExportDeclaration :

exportNamedExports ;
exportVariableStatement[~Yield, ~Await]
exportDeclaration[~Yield, ~Await]
exportdefaultHoistableDeclaration[~Yield, ~Await, +Default]
exportdefaultClassDeclaration[~Yield, ~Await, +Default]
exportdefault[lookahead ∉ { function, async [no LineTerminator here] function, class }]AssignmentExpression[+In, ~Yield, ~Await] ;

A.6 数値変換(Number Conversions)

StringNumericLiteral文法で明示的に定義されていないすべての文法記号には、数値リテラルのレキシカル文法で使用される定義があります。

A.7 ユニバーサルリソース識別子の文字クラス(Universal Resource Identifier Character Classes)

uriReserved ::: one of

;/?:@&=+$,
uriAlpha ::: one of

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
uriMark ::: one of

-_.!~*'()

A.8 正規表現(Regular Expressions)

Pattern[U, N] ::

Disjunction[?U, ?N]
Disjunction[U, N] ::

Alternative[?U, ?N]
Alternative[?U, ?N] |Disjunction[?U, ?N]
Alternative[U, N] ::

Alternative[?U, ?N] Term[?U, ?N]
Term[U, N] ::

Assertion[?U, ?N]
Atom[?U, ?N]
Atom[?U, ?N] Quantifier
Assertion[U, N] ::

^
$
\b
\B
(?=Disjunction[?U, ?N] )
(?!Disjunction[?U, ?N] )
(?<=Disjunction[?U, ?N] )
(?<!Disjunction[?U, ?N] )
Atom[U, N] ::

.
\AtomEscape[?U, ?N]
(?:Disjunction[?U, ?N] )
SyntaxCharacter :: one of

^$\.*+?()[]{}|
ControlEscape :: one of

fnrtv
ControlLetter :: one of

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
RegExpIdentifierPart[U] ::

$
[~U]UnicodeLeadSurrogate UnicodeTrailSurrogate
<ZWNJ>
<ZWJ>

u LeadSurrogate との対応があいまいな \u TrailSurrogateは、対応する \u TrailSurrogate がない最も近い u LeadSurrogate に関連付けられるものとします。

LeadSurrogate ::

Hex4Digits Hex4DigitsSV が 0xD800 から 0xDBFF の範囲内
TrailSurrogate ::

Hex4Digits Hex4DigitsSV が 0xDC00 から 0xDFFF の範囲内
NonSurrogate ::

Hex4Digits Hex4DigitsSV が 0xD800 から 0xDFFF の範囲外
CharacterClass[U] ::

[[lookahead^]ClassRanges[?U] ]
[^ClassRanges[?U] ]
ClassAtomNoDash[U] ::

SourceCharacter \ または ] または -