yield syntax (diverging from: How would shallow generators compose with lambda?)

Brendan Eich brendan at mozilla.com
Sun May 17 19:52:26 PDT 2009


On May 17, 2009, at 11:48 AM, Brendan Eich wrote:

> On May 17, 2009, at 11:00 AM, Brendan Eich wrote:
>
>> Python differs from JS by having only assignment statements, not  
>> assignment expressions, which simplifies the problem a bit, as the  
>> grep output cited above shows.
>
> Of course this makes trouble with automatic semicolon insertion,  
> unless assignment statements are split from assignment expressions.  
> D'oh!
>
> js> function g() {z = yield a ? f : x++()}
> typein:2: SyntaxError: missing ; before statement:
> typein:2: function g() {z = yield a ? f : x++()}
> typein:2: .................................^
> js> function g() {(z = yield a ? f : x++)()}

I was wrong, there's no issue here (apart from SpiderMonkey's  
diagnostic being suboptimal). This is not a case of a high-precedence  
prefix operator whose following operand is a low-precedence expression  
non-terminal. That's unsound.

In this example, yield is just like a nested assignment:

js> function g() {z = w = a ? f : x++()}
typein:1: SyntaxError: missing ; before statement:
typein:1: function g() {z = w = a ? f : x++()}
typein:1: ...............................^

where the body (z = w = a ? f : x++()) === (z = (w = (a ? f : x++()))).

If PrimaryExpression: yield AssignmentExpression were a production in  
the grammar, then we would have the bug I was worried about, the one  
that Waldemar pointed out let expressions, which also afflicts  
expression closures (ASI makes the bug harder to spot, was Waldemar's  
further point -- but ASI is not an issue here).


> Patching this is harder than I thought it would be. After hacking at  
> the Bison grammar a bit, I concede your point about implementation  
> difficulty!

I still concede greater burden on implementor, but here's an updated  
WebKit/JavaScriptCore/parser patch:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: p
Type: application/octet-stream
Size: 8839 bytes
Desc: not available
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20090517/d3e6dbfa/attachment.obj>
-------------- next part --------------




/be


More information about the es-discuss mailing list