On Nov 25, 2013, at 4:21 PM, Kevin Smith wrote:

> 
> This makes for wtfjs additions, but they all seem non-wtf on reflection (or 
> did to us when Waldemar threw them up on a whiteboard last week). By non-wtf, 
> I mean anyone who groks that yield is reserved only in function* can work 
> them out.
> 
> The star after function really helps. ES5's "use strict" directive prologue 
> in the body applying to its left (even in ES5 -- duplicate formals are a 
> strict error) is goofy.
> 
> Agree on all counts, but not quite understanding yet.
> 
> Say I'm parsing this, and the token stream is paused at the "#":
> 
>     function(a = # yield
> 
> I assume that we're not un-reserving yield in strict mode.  That means that I 
> don't know whether to treat `yield` as an identifier or reserved word until I 
> get to that goofy prologue.
> 
> Previously, I've just naively parsed parameter initializers using the same 
> strictness as the code which contains the function.
> 

Here is a simplified explanation of how it actually works in the specification:

1) 'yield' is a reserved keyword at the level of the lexical grammar [1].  This 
applies to both strict and non-strict mode.
2) The GeneratorDeclaration and GeneratorExpression productions includes the 
[Yield] grammar parameter on their RHS FormalParameter and FunctionBody 
nonterminals. [2] This parameterization makes 'yield' legal as an 
AssignmentExpression operator [3].  That use of 'yield' is only enabled within 
generator definitions and is independent of the strictness.
3) When the [Yield] parameter is not present, the  'yield' keyword is one of 
the expansions of the IdentifierReference (via UnresolvedIdentifier) [4] and 
BindingIdentifier[5] productions.  This permits 'yield' to be appear outside of 
Generator definitions in any syntactically allowed identifier position. Again, 
this is independent of strictness. 
4) There are static semantic early error rules [6], [7] that require an error 
if 'yield' actually shows up in an IdentiferReference or IdentiferBinding 
expansion within strict code.

Allen

[1]: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-keywords 
[2]: 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-generator-function-definitions
 
[3]: 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-assignment-operators 
[4]: 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-identifier-reference
[5]: 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-let-and-const-declarations
 
[6]:http://people.mozilla.org/~jorendorff/es6-draft.html#sec-identifier-reference-static-semantics-early-errors
[7]: 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-let-and-const-declarations-static-semantics-early-errors
 




> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to