<br><div class="gmail_quote">On Tue, Jun 21, 2011 at 7:23 PM, Allen Wirfs-Brock <span dir="ltr"><<a href="mailto:allen@wirfs-brock.com">allen@wirfs-brock.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word"><div>ES5.1:</div>

<h3><a name="130b33b0e84a31d2__Toc153968330"></a><a name="130b33b0e84a31d2__Toc276630941"></a><a name="130b33b0e84a31d2__Toc244416577"></a><a name="130b33b0e84a31d2__Toc241509090"></a><a name="130b33b0e84a31d2__Toc235503315"><span><span><span><span><span lang="EN-GB">7.6.1<span>   </span>Reserved Words</span></span></span></span></span></a><span lang="EN-GB"><u></u><u></u></span></h3>
<p class="MsoNormal"><span lang="EN-GB"><font color="#FF201A">A reserved word is an </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">IdentifierName</font></span></i><span lang="EN-GB"><font color="#FF201A"> that cannot be used as an </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">Identifier</font></span></i><span lang="EN-GB">.</span></p>
</div></blockquote><div><br></div><div>Descriptive. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><p class="MsoNormal"><span lang="EN-GB"><u></u><u></u></span></p>





<div>

<h2><a name="130b33b0e84a31d2__Toc153968329"></a><a name="130b33b0e84a31d2__Toc276630940"></a><a name="130b33b0e84a31d2__Toc244416576"></a><a name="130b33b0e84a31d2__Toc241509089"></a><a name="130b33b0e84a31d2__Toc235503314"></a><a name="130b33b0e84a31d2__Toc472818762"></a><a name="130b33b0e84a31d2__Ref451679320"><span><span><span><span><span><span><span lang="EN-GB">7.6<span>    </span>Identifier Names and Identifiers</span></span></span></span></span></span></span></a><span lang="EN-GB"><u></u><u></u></span></h2>
<p class="MsoNormal"><span lang="EN-GB">Identifier Names are tokens that are
interpreted according to the grammar given in the “Identifiers” section of
chapter 5 of the Unicode standard, with some small modifications. <font color="#FF201A">An </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">Identifier</font></span></i><span lang="EN-GB"><font color="#FF201A"> is an </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">IdentifierName</font></span></i><span lang="EN-GB"><font color="#FF201A"> that is not a </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">ReservedWord</font></span></i><span lang="EN-GB"><font color="#FF201A"> </font>(see 7.6.1). </span></p>
</div></div></blockquote><div>... </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><p class="MsoNormal"><span lang="EN-GB"><font color="#FF201A">Unicode escape sequences are also permitted
in an </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">IdentifierName</font></span></i><span lang="EN-GB">, where they contribute a single character to the </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">IdentifierName</span></i><span lang="EN-GB">, as computed by the CV of the </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">UnicodeEscapeSequence</span></i><span lang="EN-GB"> (see 7.8.4). The </span><b><span lang="EN-GB" style="font-family:"Courier New"">\</span></b><span lang="EN-GB"> preceding the </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">UnicodeEscapeSequence</span></i><span lang="EN-GB"> does not contribute a character to the </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">IdentifierName</span></i><span lang="EN-GB">. A </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">UnicodeEscapeSequence</span></i><span lang="EN-GB"> cannot be used to put a character into an </span><i><span lang="EN-GB" style="font-family:"Times New Roman"">IdentifierName
</span></i><span lang="EN-GB">that would otherwise be illegal. In other words,<font color="#FF201A"> if
a </font></span><b><span lang="EN-GB" style="font-family:"Courier New""><font color="#FF201A">\ </font></span></b><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">UnicodeEscapeSequence</font></span></i><span lang="EN-GB"><font color="#FF201A"> sequence were replaced by its </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">UnicodeEscapeSequence</font></span></i><span lang="EN-GB"><font color="#FF201A">'s CV, the result must still be a valid </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">IdentifierName </font></span></i><span lang="EN-GB"><font color="#FF201A">that has the exact same sequence of characters as the original </font></span><i><span lang="EN-GB" style="font-family:"Times New Roman""><font color="#FF201A">IdentifierName</font></span></i><span lang="EN-GB"><font color="#FF201A">.</font> </span></p>
</div></div></blockquote><div><br></div><div>No problem here, as  i\u0066  is definitely an IdentifierName (so is "if").</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word"><div><p class="MsoNormal">ES3 didn't distinguish <i>IdentifierName</i> from <i>Identifier</i> but from a quick scan of the ES3 language I don't see that the spec. is any different in this regard.</p>
</div></div></blockquote><div><br></div><div>Except that there was not syntactic category containing i\u0066 in ES3, but there is in ES5 (IdentifierName).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word"><div>Also, given the pervasive  substitution of Unicode escape sequences I don't see why they shouldn't be legal in reserved words.</div></div></blockquote><div><br></div><div>I used to think so too, mainly based on reading ES3, but after reading this thread a few times, I can now argue either way.</div>
<div><br></div><div>Identifier ::= IdentifierName but not ReservedWord</div><div><br></div><div>Since i\u0066 <i>is</i> an IdentifierName (it's valid to write  o.i\u0066  and  {i\u0066: 42}), and it's not a ReservedWord (there are no escapes in the ReservedWord definition), it must be an Identifier.</div>
<div><br></div><div>In ES3, the resulting character sequence had to be a valid Identifier. That meant that i\u0066 would not qualify, because "if" was not a valid identifier. In ES5, as quoted above, it just has to be a valid IdentifierName, which "if" is</div>
<div><br></div><div><br></div><div>On the other hand, every other use of IdentifierName refers to its interpreted value, after escape replacement, so that would mean that i\u0066 is not an Identifier, because its value as an IdentifierName is "if", which is a ReservedWord. That also means that there is no syntactic category for i\u0066 except IdentifierName. It's neither an Identifier, nor a keyword (because escapes are not allowed in keywords).</div>
<div><br></div><div>So, it all boils still down to whether the "but not" check is performed before or after interpretation of the input character sequence, i.e., before or after replacing escape sequences. </div>
<div>/L</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><br></div><font color="#888888"><div>Allen</div></font><div>
<div></div><div class="h5"><div><br></div><div><br></div><div><br></div><br><div><div>On Jun 21, 2011, at 5:58 PM, Mike Samuel wrote:</div><br><blockquote type="cite"><div>2011/6/20 Luke Hoban <<a href="mailto:lukeh@microsoft.com" target="_blank">lukeh@microsoft.com</a>>:<br>
<blockquote type="cite">My read of the spec is that thi\u0073 is a ReservedWord and should not be allowed as an Identifer.  So the following part of the examples quoted below should be an early error:<br></blockquote><blockquote type="cite">
<br></blockquote><blockquote type="cite"> var thi\u0073 = 42;<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">The text in 7.6 seems to address this with:<br></blockquote><blockquote type="cite">
<br></blockquote><blockquote type="cite">"All interpretations of identifiers within this specification are based upon their actual characters regardless of whether or not an escape sequence was used to contribute any particular characters."<br>
</blockquote><br>I don't think this means what you think it means.<br><br>I think this means that the identifier foo is the same identifier as f\u006fo.<br><br>But in<br><br>if (false)<br>alert(1)<br><br>"if" is not an identifier, whereas in<br>
<br>\u0069f(false)<br>alert(1)<br><br>\u0069f is an identifier which would be the same as the identifier<br>"if" if "if" could appear as an identifier unescaped.<br><br>Since "this" is not an identifier but appears explicitly in the text,<br>
that led me to assume that "thi\u0073" should behave differently from<br>"this".<br><br>Every browser I have tested treats the identifier "i\u0066" distinctly<br>from the keyword "if".<br>
Every browser I have tested treats the identifier "thi\u0073"<br>distinctly from the keyword "this" in at least some cases, but only FF<br>passes all the tests I've come up with.<br>_______________________________________________<br>
es-discuss mailing list<br><a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br><a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></blockquote></div><br></div></div></div><br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br>