Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are [Yield, Await, In, Return] in EcmaScript grammar

Many productions in EcmaScript are given with the following "modifiers":

[Yield, Await, In, Return]

Here are a few examples:

ArrayLiteral[Yield, Await]:
  ...

ElementList[Yield, Await]:
 ... AssignmentExpression[+In, ?Yield, ?Await]

I've searched through the spec for the explanation, specifically Grammar Notation section, but can't find it. It should be there. Can someone please point me to the relevant paragraph and maybe provide a short explanation?

like image 610
Max Koretskyi Avatar asked Oct 18 '22 06:10

Max Koretskyi


1 Answers

Section 5.1.5: Grammar Notation -

A production may be parameterized by a subscripted annotation of the form “[parameters]”, which may appear as a suffix to the nonterminal symbol defined by the production. “parameters” may be either a single name or a comma separated list of names. A parameterized production is shorthand for a set of productions defining all combinations of the parameter names, preceded by an underscore, appended to the parameterized nonterminal symbol. This means that:

StatementList[Return]:
   ReturnStatement
   ExpressionStatement

is a convenient abbreviation for:

StatementList:
   ReturnStatement
   ExpressionStatement
StatementList_Return:
   ReturnStatement
   ExpressionStatement

and that:

StatementList[Return, In]:
   ReturnStatement
   ExpressionStatement

is an abbreviation for:

StatementList:
   ReturnStatement
   ExpressionStatement
StatementList_Return:
   ReturnStatement
   ExpressionStatement
StatementList_In:
   ReturnStatement
   ExpressionStatement
StatementList_Return_In:
   ReturnStatement
   ExpressionStatement

Multiple parameters produce a combinatory number of productions, not all of which are necessarily referenced in a complete grammar.

It continues from there talking about parameterizing right-hand sides, adding "opt", etc.

(When searching, don't just look for [Return] and such specifically, as they can and usually do appear in groups like [Yield, Await, Return] and [?Yield, ?Await, ?Return] as in the syntax for Block.)

Section 12.1.1: Identifiers - Static Semantics: Early Errors -

It is a Syntax Error if this production has a [Yield] parameter and StringValue of Identifier is "yield".

It is a Syntax Error if this production has an [Await] parameter and StringValue of Identifier is "await".

Section 12.10: Relational Operators -

The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.

like image 172
T.J. Crowder Avatar answered Nov 02 '22 23:11

T.J. Crowder