docs: function parsePrimaryExpression() {
          var type, token, expr, node;
  
          if (match('(')) {
              return parseGroupExpression();
          }
  
          if (match('[')) {
              return parseArrayInitialiser();
          }
  
          if (match('{')) {
              return parseObjectInitialiser();
          }
  
          type = lookahead.type;
          node = new Node();
  
          if (type === Token.Identifier) {
              expr = node.finishIdentifier(lex().value);
          } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
              if (strict && lookahead.octal) {
                  tolerateUnexpectedToken(lookahead, Messages.StrictOctalLiteral);
              }
              expr = node.finishLiteral(lex());
          } else if (type === Token.Keyword) {
              if (matchKeyword('function')) {
                  return parseFunctionExpression();
              }
              if (matchKeyword('this')) {
                  lex();
                  return node.finishThisExpression();
              }
              if (matchKeyword('class')) {
                  return parseClassExpression();
              }
              throwUnexpectedToken(lex());
          } else if (type === Token.BooleanLiteral) {
              token = lex();
              token.value = (token.value === 'true');
              expr = node.finishLiteral(token);
          } else if (type === Token.NullLiteral) {
              token = lex();
              token.value = null;
              expr = node.finishLiteral(token);
          } else if (match('/') || match('/=')) {
              index = startIndex;
  
              if (typeof extra.tokens !== 'undefined') {
                  token = collectRegex();
              } else {
                  token = scanRegExp();
              }
              lex();
              expr = node.finishLiteral(token);
          } else {
              throwUnexpectedToken(lex());
          }
  
          return expr;
      }