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

              addToString(c); //и записать первую литеру в буфер

          }

      }

if (identifierStart) {    //если была прочитана первая литера идентификатора/ключевого слова/…

boolean containsEscape = isUnicodeEscapeStart;

          for (;;) {                 //цикл обработки остальных литер слова

              if (isUnicodeEscapeStart) {   //если было прочитано начало escape-последовательности

// strictly speaking we should probably push-back

                  // all the bad characters if the <backslash>uXXXX

                  // sequence is malformed. But since there isn't a

                  // correct context(is there?) for a bad Unicode

                  // escape sequence in an identifier, we can report an error here.

                  intescapeVal = 0;   //переменная для Unicode-символа

for (int i = 0; i != 4; ++i) {         //цикл чтения 4-х литер

                      c = getChar();

                      escapeVal = Kit.xDigitToInt(c, escapeVal);//преобразование

                      // Next check takes care about c < 0 and bad escape

                      if (escapeVal < 0) { break; }

                  }

                  if (escapeVal < 0) {           //если код отрицателен

                      parser.addError("msg.invalid.escape");

                      returnToken.ERROR;   //то возврат ошибки

                  }

addToString(escapeVal);   //занесение символа в буфер

isUnicodeEscapeStart = false;    //и сброс флажка

              } else {

                  c = getChar();         //прочитать следующую литеру

if (c == '\\') { //если это обратный слэш «\»

c = getChar();     //то прочитать еще одну литеру

if (c == 'u') {       //внутри идентификатора она должна быть литерой u

isUnicodeEscapeStart = true;       //установить флажки

                          containsEscape = true;

} else {       //если это не литера u

parser.addError("msg.illegal.character");

                          returnToken.ERROR;                    //то вернуть ошибку

}

                  } else {

                 if (c == EOF_CHAR || !Charater.isJavaIdentifierPart((char)c))

{                 //если текущая литера не принадлежит

break;    //текущему идентификатору, то выйти из цикла

                      }

addToString(c);   //добавить текущую литеру к буферу

                  }

              }

          }

ungetChar(c);        //возвратить на вход первую литеру слова, следующего за идентификатором

String str = getStringFromBuffer();    //получить слово как String

          if (!containsEscape) {      //были ли в слове escape-последовательности? Если нет:

              // OPT we shouldn't have to make a string (object!) to

              // check if it's a keyword.

              // Return the corresponding token if it's a keyword

              intresult = stringToKeyword(str); //получить код ключевого слова или Token.EOF, если слово не ключевое

if (result != Token.EOF) {

//опущено: обработка ключевых слов, возможность употребления которых зависит от версии интерпретатора

              }

          }

this.string = (String)allStrings.intern(str);   //вызывается метод класса allStrings, проверяющий наличие

//прочитанного идентификатора в рандомизированной таблице всех строк обрабатываемой программы

//и добавляющий идентификатор в таблицу при самом первом обнаружении его в тексте.

returnToken.NAME;       //код группы слов «идентификаторы»

      }

//конец обработки идентификаторов

      // isitanumber?

if (isDigit(c) || (c == '.' && isDigit(peekChar()))) {   //если текущая литера – цифра или текущая литера – точка,

//а следующая литера - цифра

stringBufferTop = 0;       //подготовить буфер

intbase = 10;        //установить основание системы счисления = 10

if (c == '0') {         //если первая литера – цифра 0

c = getChar();             //прочитать вторую литеру

if (c == 'x' || c == 'X') {        //если это латинская x или X