/*
 *  Parsing of identifier names (E5 Section 7.6).
 */

/*---
{
    "skip": true
}
---*/

/* FIXME: more complex cases */

/*
 *  Some specific identifier names
 */

/*===
10
20
===*/

try {
    eval('$=10; print($);');
} catch (e) {
    print(e.name);
}

try {
    eval('_=20; print(_);');
} catch (e) {
    print(e.name);
}


/*
 *  Escapes in IdentifierStart and IdentifierPart
 */

/*===
SyntaxError
SyntaxError
val
3
SyntaxError
===*/

/* These test were added because Rhino fails some, and some early code
 * failed here too.  It's easy to forget a check if the char is escaped,
 * or to apply an IdentifierPart check for an escaped IdentifierStart
 * (IdentifierPart is wider).
 */

/* Rhino fails */
try {
    eval('\\u0001x = "val";');   /* U+0001 not allowed in IdentifierStart or IdentifierPart */
    print('1');
} catch (e) {
    print(e.name);
}

/* Rhino fails */
try {
    eval('\\u0030x = "val";');   /* identifier '0x', not allowed */
    print('2');
} catch (e) {
    print(e.name);
}

try {
    eval('x\\u0030 = "val";');   /* identifier 'x0', allowed */
    print(x0);
    print('3');
} catch (e) {
    print(e.name);
}

/* There is no hex escape for identifier names. */
try {
    eval('x\\x30 = "val";');   /* identifier 'x0' */
    print('4');
} catch (e) {
    print(e);
}

