On Oct 20, 2011, at 12:31 AM, Andreas Rossberg wrote:

> One concern might be that we probably cannot make arrow notation (if
> we introduce it) a primary expression, and it might be confusing if
> they have different precedence.

We absolutely cannot and the strawman specifies the grammar fully:

http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax

AssignmentExpression :
    ArrowFunctionExpression
    ...

ArrowFunctionExpression :
    ArrowFormalParameters_opt Arrow AssignmentExpression
    ArrowFormalParameters_opt Arrow ArrowBodyBlock_opt

ArrowFormalParameters :
    ( FormalParameterList_opt )
    ( this Initialiser_opt )
    ( this Initialiser_opt , FormalParameterList )

Arrow : one of -> or =>

Arrow function expressions must be low precedence, unparenthesized on the right 
of assignment operators.


> I also think it is easier to parse for the human reader when he sees
> 
>  (function f() { ... })()
> 
> instead of
> 
>  function f() { ... }()
> 
> especially when this occurs as a statement. (Mh, actually, could we
> even distinguish between function declerations and expression
> statements starting with a function expr in LALR(1), without heavy
> grammar transformation?)

The grammar currently uses a lookahead restriction to disambiguate in favor of 
function declaration:

12.4 Expression Statement

Syntax

ExpressionStatement :
    [lookahead ∉ {{, function}] Expression ;

NOTE An ExpressionStatement cannot start with an opening curly brace because 
that might make it ambiguous with a
Block. Also, an ExpressionStatement cannot start with the function keyword 
because that might make it ambiguous with a
FunctionDeclaration.


/be


> 
> /Andreas
> 
> On 20 October 2011 01:20, Brendan Eich <bren...@mozilla.com> wrote:
>> On Oct 19, 2011, at 3:29 PM, Allen Wirfs-Brock wrote:
>> 
>> On Oct 19, 2011, at 2:53 PM, Brendan Eich wrote:
>> 
>> On Oct 19, 2011, at 8:16 AM, Allen Wirfs-Brock wrote:
>> 
>> Function expressions were added in ES3. Were they just added at the wrong
>> place in the grammar?
>> 
>> Thanks for raising this, I keep forgetting to.
>> Oddly enough, SpiderMonkey always had them (prior to ES3 even being drafted)
>> as PrimaryExpressions. No one can observe the difference, as you note.
>> Either way, one can write
>>   var fun_member = function () {}.member;
>> On aesthetic grounds, I would prefer the grammar to make function
>> expressions primary.
>> 
>> Good, I want to make that change because for semantic specification purposes
>> FunctionExpression works better as PrimaryExpression.
>> I just wanted to make sure, before I make the change, that there wasn't some
>> grammatical subtlety I was overlooking
>> 
>> Toy grammar (| is meta, other punctuators after the : are concrete):
>> E: ME
>> ME: PE | FE | ME [ E ] | ME . ID | ...
>> PE: ( E ) | ...
>> and there's no way that ME -> FE would be reduced where ME -> PE -> FE was
>> not possible, *and* there are no PE occurrences on the RHS of a production
>> whose LHS is *not* ME, then FE can move "down" one precedence level from
>> being the sole RHS part of ME, to being the sole RHS of PE.
>> (Lotta abbreviation there, sorry.)
>> Trivial search shows PrimaryExpression occurs in only one RHS, as the sole
>> RHS part produced from MemberExpression.
>> /be
>> 
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>> 
>> 

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to