On Oct 16, 2008, at 7:01 PM, Brendan Eich wrote:
On Oct 16, 2008, at 3:33 PM, Brendan Eich wrote:
On Oct 16, 2008, at 1:20 PM, Waldemar Horwat wrote:
I don't think you can come up with a consistent "shift" or
"greedy" notion.
Funny, yacc has had one for decades, used to resolve dangling-else.
Which ES1-3 also use:
12.5 The if Statement
Syntax
IfStatement :
if ( Expression ) Statement else Statement
if ( Expression ) Statement
Each else for which the choice of associated if is ambiguous shall
be associated with the nearest possible if that would otherwise have
no corresponding else.
The grammar is not enough in ES3 without let expressions. You need
at least this shift-reduce conflict resolution rule (I'm ignoring
ASI, / as division vs. regexp delimiter, etc.). Adding let
expressions does not add novel requirements for extra-grammatical
disambiguation rules.
The ambiguity between blocks and object initialisers is another well-
known case, resolved by "negative lookahead":
12.4 Expression Statement
Syntax
ExpressionStatement :
[lookahead ∉ {{, function}] Expression ;
This one can be solved without negative lookahead, we have separate
NoBF (no brace or function) and NoIn productions in our grammar to
solve these without ambiguity:
Expr:
AssignmentExpr
| Expr ',' AssignmentExpr
;
ExprNoIn:
AssignmentExprNoIn
| ExprNoIn ',' AssignmentExprNoIn
;
ExprNoBF:
AssignmentExprNoBF
| ExprNoBF ',' AssignmentExpr
;
With the NoIn / NoBF variants propagated through the rest of the
grammar if needed. Kind of brute force, but it does the job without
ambiguity. JavaScriptCore's grammar runs through bison with no shift/
reduce or reduce/reduce conflicts.
I think it might be better to write the official ES3.1 grammar in this
way, even though it is a little annoying and repetitive, so it can
more readily be verified that the language grammar has no ambiguities
by running through a parser-generator like yacc or bison or
boost::spirit.
As to the else issue, I don't think that ambiguity can be avoided, but
bison lets you solve that with %nonassoc, which is a sound
disambiguation mechanism.
Regards,
Maciej
_______________________________________________
Es-discuss mailing list
Es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss