parser.addError("msg.unterminated.string.lit");
return Token.ERROR; //вернуть ошибку
}
if (c == '\\') { //далее – обработка обратного слэша и следующих(ей) за ним литер(ы)
// We've hit an escaped character
int escapeVal; //временная переменная для Unicode-символа
c = getChar(); //прочитать следующую литеру
switch (c) { // сформировать новое значение переменной c
case 'b': c = '\b'; break; //забой
case 'f': c = '\f'; break; //вертикальная табуляция
case 'n': c = '\n'; break; //перевод строки
case 'r': c = '\r'; break; //возврат каретки
case 't': c = '\t'; break; //табуляция
// \v a late addition to the ECMA spec,
// it is not in Java, so use 0xb
case 'v': c = 0xb; break; //\v заменяется на 0xb согласно спецификации ECMA
case 'u': //начало Unicode-литерала. Обработка похожа на то, что делалось для числового литерала,
//но есть отличие: если после \u не следует правильный Unicode-символ,
//то вся последовательность, начиная с литеры u, запоминается в буфере без преобразования
// Get 4 hex digits; if the u escape is not
// followed by 4 hex digits, use 'u' + the
// literal character sequence that follows.
int escapeStart = stringBufferTop;
addToString('u');
escapeVal = 0;
for (int i = 0; i != 4; ++i) {
c = getChar();
escapeVal = Kit.xDigitToInt(c, escapeVal);
if (escapeVal < 0) { //если неверный Unicode-символ
continuestrLoop; //то продолжить внешний цикл обработки строкового литерала
}
addToString(c);
}
// prepare for replace of stored 'u' sequence by escape value
stringBufferTop = escapeStart; //если из предыдущего цикла выход выполнен не оператором continue,
//то поместить Unicode-символ в буфер вместо его литерала
c = escapeVal;
break;
case 'x': //обработка символьного литерала \xXX, приведено без доп. комментария
// Get 2 hex digits, defaulting to 'x'+literal sequence, as above.
c = getChar();
escapeVal = Kit.xDigitToInt(c, 0);
if (escapeVal < 0) {
addToString('x');
continue strLoop;
} else {
int c1 = c;
c = getChar();
escapeVal = Kit.xDigitToInt(c, escapeVal);
if (escapeVal < 0) {
addToString('x');
addToString(c1);
continue strLoop;
} else { // got 2 hex digits
c = escapeVal;
}
}
break;
case '\n': //не путать с 'n'
// Remove line terminator after escape to follow SpiderMonkey and C/C++
c = getChar(); //читать следующую литеру, игнорируя перевод строки после «\»
continuestrLoop;
default:
if ('0' <= c && c < '8') { //обработка унаследованного из языка С 8-ричного литерала вида\XXX
int val = c - '0';
c = getChar();
if ('0' <= c && c < '8') {
val = 8 * val + c - '0';
c = getChar();
if ('0' <= c && c < '8' && val <= 037) {
// c is 3rd char of octal sequence only
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.