Возможная фактическая последовательность этапов компиляции. Последовательность этапов работы интерпретатора, страница 4

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