title: How does `yield` and `await` production parameters expand into `*` and `async` before identifiers
body: <p>Can anyone explain how the following production expands into <code>*</code> and <code>async</code> keywords:</p>
  
  <pre><code>BindingIdentifier[Yield, Await]:
     Identifier
     [~Yield]yield
     [~Await]await
  </code></pre>
  
  <p>Based on the TypeScript parsing code I see that it checks for <code>*</code> and <code>async</code> keywords, so I assume here that <code>BindingIdentifier_Yield</code> matches <code>*identifier</code> and <code>BindingIdentifier_Await</code> matches <code>async identifier</code> but I can't seem to trace that expansion using the above grammar.</p>
  
  <p>I know I can expand the identifiers <code>[Yield, Await]</code> according to the spec:</p>
  
  <blockquote>
    <p>A production may be parameterized by a subscripted annotation of the
    form “[parameters]”... 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</p>
  </blockquote>
  
  <p>So the above is expanded into:</p>
  
  <pre><code>BindingIdentifier:
     Identifier
     [~Yield]yield
     [~Await]await
  
  BindingIdentifier_Yield:
     Identifier
     [~Yield]yield
     [~Await]await
  
  BindingIdentifier_Await:
     Identifier
     [~Yield]yield
     [~Await]await
  </code></pre>
  
  <p>But how then <code>BindingIdentifier_Yield</code> and <code>BindingIdentifier_Await</code> is expanded into <code>*</code> and <code>async</code>? I suspect that the explanation is here:</p>
  
  <pre><code>[~Yield]yield
  [~Await]await
  </code></pre>
  
  <p>but I'm not sure. Any help is welcome!</p>