docs: function scanPunctuator() {
          var token, str;
  
          token = {
              type: Token.Punctuator,
              value: '',
              lineNumber: lineNumber,
              lineStart: lineStart,
              start: index,
              end: index
          };
  
          // Check for most common single-character punctuators.
          str = source[index];
          switch (str) {
  
          case '(':
              if (extra.tokenize) {
                  extra.openParenToken = extra.tokenValues.length;
              }
              ++index;
              break;
  
          case '{':
              if (extra.tokenize) {
                  extra.openCurlyToken = extra.tokenValues.length;
              }
              state.curlyStack.push('{');
              ++index;
              break;
  
          case '.':
              ++index;
              if (source[index] === '.' && source[index + 1] === '.') {
                  // Spread operator: ...
                  index += 2;
                  str = '...';
              }
              break;
  
          case '}':
              ++index;
              state.curlyStack.pop();
              break;
          case ')':
          case ';':
          case ',':
          case '[':
          case ']':
          case ':':
          case '?':
          case '~':
              ++index;
              break;
  
          default:
              // 4-character punctuator.
              str = source.substr(index, 4);
              if (str === '>>>=') {
                  index += 4;
              } else {
  
                  // 3-character punctuators.
                  str = str.substr(0, 3);
                  if (str === '===' || str === '!==' || str === '>>>' ||
                      str === '<<=' || str === '>>=') {
                      index += 3;
                  } else {
  
                      // 2-character punctuators.
                      str = str.substr(0, 2);
                      if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
                          str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
                          str === '++' || str === '--' || str === '<<' || str === '>>' ||
                          str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
                          str === '<=' || str === '>=' || str === '=>') {
                          index += 2;
                      } else {
  
                          // 1-character punctuators.
                          str = source[index];
                          if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
                              ++index;
                          }
                      }
                  }
              }
          }
  
          if (index === token.start) {
              throwUnexpectedToken();
          }
  
          token.end = index;
          token.value = str;
          return token;
      }