On Jun 28, 2011, at 3:10 PM, Brendan Eich wrote:

> Block:
>     { UnlabeledStatementFirstList }
>     { WellLabeledStatement StatementList? }
> 
> UnlabeledStatementFirstList:
>     UnlabeledStatement
>     UnlabeledStatementFirstList Statement
> 
> Statement:
>     UnlabeledStatement
>     LabeledStatement
> 
> UnlabeledStatement:
>     Block
>     VariableStatement
>     EmptyStatement
>     ExpressionStatement
>     ContinueStatement
>     ReturnStatement
>     LabelUsingStatement
>     DebuggerStatement
> 
> LabelUsingStatement:
>     IfStatement
>     IterationStatement
>     BreakStatement
>     WithStatement
>     SwitchStatement
>     ThrowStatement
>     TryStatement
> 
> LabeledStatement:
>     Identifier : Statement
> 
> WellLabeledStatement:
>     Identifier : LabelUsingStatement
>     Identifier : WellLabeledStatement
> 
> ...

> If I have this right, then we could add a new production:
> 
> PrimaryExpression:
>     Block

This creates an LR(1) ambiguity, a shift-reduce conflict between shifting : in

WellLabeledStatement : Identifier.: LabelUsingStatement
WellLabeledStatement : Identiifer.: WellLabeledStatement

and reducing on : lookahead via

PropertyName : Identifier.

under PropertyAssignment under ObjectLiteral.

(The dots in the productions are yacc/bison-style cursors showing where the 
parse is.)

One easy fix is to "de-minimize" the PropertyAssignment grammar:

PropertyAssignment:
    PropertyName : AssignmentExpression
    get PropertyName ( ) { FunctionBody }
    set PropertyName ( PropertySetParameterList ) { FunctionBody }

PropertyName:
    IdentifierName
    StringLiteral
    NumericLiteral

to look like this:

PropertyAssignment:
    IdentifierName : AssignmentExpression
    StringLiteral : AssignmentExpression
    NumericLiteral : AssignmentExpression
    get PropertyName ( ) { FunctionBody }
    set PropertyName ( PropertySetParameterList ) { FunctionBody }

PropertyName:
    IdentifierName
    StringLiteral
    NumericLiteral

This works because the lookahead after : in this revised PropertyAssignment and 
in WellLabeledStatement is disjoint except for { and that loops back through 
the same paths, with the tie broken by a disjoint lookahead token, eventually.

Is this grammar refactoring worth the trouble? Making blocks be expressions 
could be well worth it if we accept block-lambdas. Just for statements as 
expressions, I'm not sure. Comments welcome.

/be


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

Reply via email to