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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.