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

                                  // if the resulting val <= 0377

                                  val = 8 * val + c - '0';

                                  c = getChar();

                              }

                          }

                          ungetChar(c);

                          c = val;

}

                  }

              }

addToString(c); //код литеры, возможно сформированный выше, добавить в буфер

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

          }

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

this.string = (String)allStrings.intern(str);    //добавить в таблицу

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

      }

if (c == '@') returnToken.XMLATTR; //вернуть токен начала XML – атрибута

switch (c) {                //этот переключатель обрабатывает все остальные слова языка JavaScript

case ';':returnToken.SEMI; //литера «;» – это отдельное слово языка

case '[': returnToken.LB;    //литера «[» – также отдельное слово

case ']': return Token.RB;             // …

      case '{': return Token.LC;             // …

      case '}': return Token.RC;             // …

      case '(': return Token.LP;              // …

      case ')': return Token.RP;              // …

      case ',': return Token.COMMA;    // …

      case '?': return Token.HOOK;       // …

      case ':':            //с литеры «:» начинаются однолитерное слово : и двухлитерное слово ::

if (matchChar(':')) {         //метод matchChar читает со входа

//следующую литеру и возвращает истину, если она совпадает с его аргументом, иначе не делает ничего

return Token.COLONCOLON;

          } else {

              return Token.COLON;

}

case '.'://с точки начинаются слова DOT, DOTDOT и DOTQUERY

if (matchChar('.')) {

              return Token.DOTDOT;

          } else if (matchChar('(')) {

              return Token.DOTQUERY;

          } else {

              return Token.DOT;

}

case '|': //аналогично, с литеры «|» начинаются слова OR, ASSIGN_BITOR и BITOR:

if (matchChar('|')) {

              return Token.OR;

          } else if (matchChar('=')) {

              return Token.ASSIGN_BITOR;

          } else {

              returnToken.BITOR;

          }         //следующие ниже операторы case (вплоть до case  '!')

//аналогичным образом обрабатывают одно-, двух- или трехлитерные слова

case '^':

          if (matchChar('=')) {

              return Token.ASSIGN_BITXOR;

          } else {

              return Token.BITXOR;

          }

      case '&':

          if (matchChar('&')) {

              return Token.AND;

          } else if (matchChar('=')) {

              return Token.ASSIGN_BITAND;

          } else {

              return Token.BITAND;

          }

      case '=':

          if (matchChar('=')) {

              if (matchChar('='))

                  return Token.SHEQ;

              else

                  return Token.EQ;

          } else {

              return Token.ASSIGN;

          }

      case '!':

          if (matchChar('=')) {

              if (matchChar('='))

                  return Token.SHNE;

              else

                  return Token.NE;

} else {

returnToken.NOT;

          }

case '<': //особая ситуация: с последовательности <!--

//начинается HTML-комментарий, использующийся для скрытия JavaScript-кода от старых браузеров

/* NB:treat HTML begin-comment as comment-till-eol */

          if (matchChar('!')) {

              if (matchChar('-')) {

                  if (matchChar('-')) {

                      skipLine(); //метод skipLine пропускает все литеры

//входного потока вплоть до конца строки или конца файла, что встретится раньше

continue retry;

                  }

                  ungetCharIgnoreLineEnd('-');     //этот метод возвращает

//на вход литеру, явно указываемую в качестве аргумента (прочитанную предшествующим методом matchChar)