このページはECMAScript® 2020 Language Specificationの A Grammar Summary章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。
A.1 レキシカル文法(Lexical Grammar)
ReservedWord :: one of
awaitbreakcasecatchclassconstcontinuedebuggerdefaultdeletedoelseenumexportextendsfalsefinallyforfunctionifimportininstanceofnewnullreturnsuperswitchthisthrowtruetrytypeofvarvoidwhilewithyield
OtherPunctuator :: one of
{()[]....;,<><=>===!====!==+-*%**++--<<>>>>>&|^!~&&||???:=+=-=*=%=**=<<=>>=>>>=&=|=^==>
A.2 式(Expressions)
PrimaryExpression[Yield, Await] :
this
IdentifierReference[?Yield, ?Await]
ArrayLiteral[?Yield, ?Await]
ObjectLiteral[?Yield, ?Await]
ClassExpression[?Yield, ?Await]
TemplateLiteral[?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
次のプロダクションのインスタンスを処理するとき
CoverParenthesizedExpressionAndArrowParameterListの解釈は、次の文法を使用して改善されます。
PropertyDefinition[Yield, Await] :
IdentifierReference[?Yield, ?Await]
CoverInitializedName[?Yield, ?Await]
MethodDefinition[?Yield, ?Await]
CallExpression[Yield, Await] :
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
SuperCall[?Yield, ?Await]
ImportCall[?Yield, ?Await]
次プロダクションのインスタンスを処理するとき
CoverCallExpressionAndAsyncArrowHead の解釈は、次の文法を使用して改善されます。
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
OptionalExpression[?Yield, ?Await]
MultiplicativeExpression[Yield, Await] :
ExponentiationExpression[?Yield, ?Await]
MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?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]
ArrowFunction[?In, ?Yield, ?Await]
AsyncArrowFunction[?In, ?Yield, ?Await]
次のプロダクションのインスタンスを処理するときの特定の状況において、
LeftHandSideExpression の解釈は、次の文法を使用して改善されます。
AssignmentPattern[Yield, Await] :
ObjectAssignmentPattern[?Yield, ?Await]
ArrayAssignmentPattern[?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]
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]
StatementListItem[Yield, Await, Return] :
Statement[?Yield, ?Await, ?Return]
Declaration[?Yield, ?Await]
BindingPattern[Yield, Await] :
ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?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]
IterationStatement[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]
CaseBlock[Yield, Await, Return] :
{CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt }
LabelledItem[Yield, Await, Return] :
Statement[?Yield, ?Await, ?Return]
FunctionDeclaration[?Yield, ?Await, ~Default]
A.4 関数とクラス(Functions and Classes)
FunctionDeclaration[Yield, Await, Default] :
functionBindingIdentifier[?Yield, ?Await] (FormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
FunctionExpression :
functionBindingIdentifier[~Yield, ~Await]opt (FormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
FormalParameters[Yield, Await] :
FunctionRestParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await]
ArrowParameters[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
次のプロダクションのとき、
次のプロダクションは、 CoverParenthesizedExpressionAndArrowParameterList の解釈を改善するために使用されます。
AsyncArrowFunction[In, Yield, Await] :
async[no LineTerminator here]AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here]=>AsyncConciseBody[?In]
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here]=>AsyncConciseBody[?In]
次のプロダクションのとき、
AsyncArrowFunction[In, Yield, Await] :
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here]=>AsyncConciseBody[?In]
次のプロダクションは、 CoverCallExpressionAndAsyncArrowHead の解釈を改善するために使用されます。
MethodDefinition[Yield, Await] :
PropertyName[?Yield, ?Await] (UniqueFormalParameters[~Yield, ~Await] ){FunctionBody[~Yield, ~Await] }
GeneratorMethod[?Yield, ?Await]
AsyncMethod[?Yield, ?Await]
AsyncGeneratorMethod[?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 }
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]functionBindingIdentifier[~Yield, +Await] (FormalParameters[~Yield, +Await] ){AsyncFunctionBody }
AsyncMethod[Yield, Await] :
async[no LineTerminator here]PropertyName[?Yield, ?Await] (UniqueFormalParameters[~Yield, +Await] ){AsyncFunctionBody }
A.5 スクリプトとモジュール(Scripts and Modules)
ExportDeclaration :
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)
A.8 正規表現(Regular Expressions)
u LeadSurrogate との対応があいまいな \u TrailSurrogateは、対応する \u TrailSurrogate がない最も近い u LeadSurrogate に関連付けられるものとします。