docs: function scanPunctuator() {
          var start = index,
              code = source.charCodeAt(index),
              code2,
              ch1 = source[index],
              ch2;
  
          switch (code) {
  
          // Check for most common single-character punctuators.
          case 46:   // . dot
          case 40:   // ( open bracket
          case 41:   // ) close bracket
          case 59:   // ; semicolon
          case 44:   // , comma
          case 123:  // { open curly brace
          case 125:  // } close curly brace
          case 91:   // [
          case 93:   // ]
          case 58:   // :
          case 63:   // ?
              ++index;
              return {
                  type: Token.Punctuator,
                  value: String.fromCharCode(code),
                  range: [start, index]
              };
  
          default:
              code2 = source.charCodeAt(index + 1);
  
              // '=' (char #61) marks an assignment or comparison operator.
              if (code2 === 61) {
                  switch (code) {
                  case 37:  // %
                  case 38:  // &
                  case 42:  // *:
                  case 43:  // +
                  case 45:  // -
                  case 47:  // /
                  case 60:  // <
                  case 62:  // >
                  case 124: // |
                      index += 2;
                      return {
                          type: Token.Punctuator,
                          value: String.fromCharCode(code) + String.fromCharCode(code2),
                          range: [start, index]
                      };
  
                  case 33: // !
                  case 61: // =
                      index += 2;
  
                      // !== and ===
                      if (source.charCodeAt(index) === 61) {
                          ++index;
                      }
                      return {
                          type: Token.Punctuator,
                          value: source.slice(start, index),
                          range: [start, index]
                      };
                  default:
                      break;
                  }
              }
              break;
          }
  
          // Peek more characters.
  
          ch2 = source[index + 1];
  
          // Other 2-character punctuators: && ||
  
          if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
              index += 2;
              return {
                  type: Token.Punctuator,
                  value: ch1 + ch2,
                  range: [start, index]
              };
          }
  
          if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
              ++index;
              return {
                  type: Token.Punctuator,
                  value: ch1,
                  range: [start, index]
              };
          }
  
          throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
      }