<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Oct 16, 2008, at 3:33 PM, Brendan Eich wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Oct 16, 2008, at 1:20 PM, Waldemar Horwat wrote:</div><div><br></div><blockquote type="cite"><div>I don't think you can come up with a consistent "shift" or "greedy" notion.</div></blockquote><div><br></div>Funny, yacc has had one for decades, used to resolve dangling-else.</div><div></div></div></blockquote></div><br><div>Which ES1-3 also use:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Helvetica; "><b>12.5 The if Statement</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><b>Syntax</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><i>IfStatement </i><b>:</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><b>&nbsp;&nbsp; &nbsp; &nbsp;if ( </b><i>Expression </i><b>) </b><i>Statement </i><b>else </b><i>Statement</i></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><b>&nbsp;&nbsp; &nbsp; &nbsp;if ( </b><i>Expression </i><b>) </b><i>Statement</i></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; ">Each <b>else </b>for which the choice of associated <b>if </b>is ambiguous shall be associated with the nearest possible <b>if </b>that&nbsp;would otherwise have no corresponding <b>else</b>.</div></div><div><br></div><div>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.</div><div><br></div><div>The ambiguity between blocks and object initialisers is another well-known case, resolved by "negative lookahead":</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Helvetica; "><b>12.4 Expression Statement</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><b>Syntax</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><i>ExpressionStatement </i><b>:</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 8px/normal Helvetica; ">&nbsp;&nbsp; &nbsp; &nbsp;[lookahead ∉ {<b>{, function</b>}] <span style="font: 10.0px Helvetica"><i>Expression </i><b>;</b></span></div></div><div><br></div><div>/be</div></body></html>