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

base = 16;     //то основание = 16

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

            } elseif (isDigit(c)) { //иначе, если после литеры 0 следует цифра

base = 8;       //то основание = 8

              } else {        //иначе, запомнить лидирующий 0 в буфере

addToString('0');

              }

          }

if (base == 16) {              //если основание 16

while (0 <= Kit.xDigitToInt(c, 0)) {          //то до тех пор, пока на входе 16-ричные цифры

addToString(c);       //накапливать их в буфере

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

              }

          } else {

while('0' <= c && c <= '9') { //пока на входе десятичные цифры

/*

                   * We permit 08 and 09 as decimal numbers, which

                   * makes our behavior a superset of the ECMA

                   * numeric grammar.  We might not always be so

                   * permissive, so we warn about it.

*/

if (base == 8 && c >= '8') {       //если основание = 8 и очередная цифра > 7

parser.addWarning("msg.bad.octal.literal",c =='8'?"8" : "9");

                    base = 10; //добавить предупреждение и установить основание = 10

                  }

addToString(c);       //запоминать цифры в буфере

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

              }

          }

booleanisInteger = true;          //флажок «целое» по умолчанию

if (base==10 && (c == '.' || c == 'e' || c == 'E')) {//если основание 10 и очереднаялитера – это точка

//или буква e или буква E

isInteger = false;         //сбросить флажок «целое»

if (c == '.') {      //если после целой части точка

do {      //то все последующие цифры запомнить в буфере

addToString(c);

                      c = getChar();

                  } while (isDigit(c));

}

if (c == 'e' || c == 'E') {        //если после целой или дробной части следует e или E

addToString(c);       //то признак экспоненциальной формы запомнить в буфере

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

if (c == '+' || c == '-') {    //если это знак экспоненты

addToString(c);   //то поместить его в буфер и прочитать следующую литеру

c = getChar();

                  }

if (!isDigit(c)) {        //и проверить, что в экспоненте есть хотя бы одна цифра

parser.addError("msg.missing.exponent");

                      returnToken.ERROR;   //вернуть ошибку, если цифр нет

                  }

do {                //до тех пор, пока на входе цифры

addToString(c);   //запоминать их в буфере

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

                  } while (isDigit(c));

              }

          }

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

StringnumString = getStringFromBuffer(); //получить строковое представление литерала

doubledval; //временная переменная для значения числа опущено: преобразование числового литерала

//во внутреннее представление числа

this.number = dval;         //сохранить значение числа

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

      }

//конец обработки численных литералов

      // isitastring?

if (c == '"' || c == '\'') {       //если текущая литера – одиночный апостроф или двойная кавычка

// We attempt to accumulate a string the fast way, by

          // building it directly out of the reader.  But if there

          // are any escaped characters in the string, we revert to

          // building it out of a StringBuffer.

          intquoteChar = c; // запомнить открывающую литеру строки во временной переменной

stringBufferTop = 0;//подготовить буфер для строкового литерала

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

strLoop: while (c != quoteChar) { //до тех пор, пока текущая литера не равна открывающей литере

if (c == '\n' || c == EOF_CHAR) { //если прочитан конец строки или конец файла

ungetChar(c);          //вернуть литеру на вход