/*
 *  E5 Section 15.10.2.8 notes on backtracking for lookaheads.
 */

var t;

/*===
 aaa
aba a
===*/

t = /(?=(a+))/.exec('baaabac');
print(t[0], t[1]);

t = /(?=(a+))a*b\1/.exec('baaabac');
print(t[0], t[1]);

/*===
baaabaac ba undefined abaac
===*/

t = /(.*?)a(?!(a+)b\2c)\2(.*)/.exec('baaabaac');
print(t[0], t[1], t[2], t[3]);

/*===
xy x undefined
xz undefined x
===*/

t = /(?=(x))xy|(?=(x))xz/.exec('xy');
print(t[0], t[1], t[2]);

t = /(?=(x))xy|(?=(x))xz/.exec('xz');
print(t[0], t[1], t[2]);

/*===
abab ab
null object
===*/

/* lookahead captures 'ab' */
t = /(?=(ab|abc))\1\1/.exec('abab');
print(t[0], t[1]);

/* lookahead still captures 'ab' and backrefs fail; lookahead never tries to capture 'abc' */
t = /(?=(ab|abc))\1\1/.exec('abcabc');
print(t, typeof t);

