parseArrayLiteral_() {
    let start = this.getTreeStartLocation_();
    let expression;
    let elements = [];

    this.eat_(OPEN_SQUARE);

    let type = peekType();
    if (type === FOR && this.options_.arrayComprehension)
      return this.parseArrayComprehension_(start);

    while (true) {
      type = peekType();
      if (type === COMMA) {
        expression = null;
      } else if (this.peekSpread_(type)) {
        expression = this.parseSpreadExpression_();
      } else if (type === CLOSE_SQUARE || type === END_OF_FILE) {
        break;
      } else {
        expression = this.parseAssignmentExpression_(ALLOW_IN);
      }

      elements.push(expression);

      type = peekType();
      if (type !== CLOSE_SQUARE)
        this.eat_(COMMA);
    }
    this.eat_(CLOSE_SQUARE);
    return new ArrayLiteral(this.getTreeLocation_(start), elements);
  }
Parse array literal and delegates to {@code parseArrayComprehension_} as
needed.

ArrayLiteral :
  [ Elisionopt ]
  [ ElementList ]
  [ ElementList , Elisionopt ]

ElementList :
  Elisionopt AssignmentExpression
  Elisionopt ... AssignmentExpression
  ElementList , Elisionopt AssignmentExpression
  ElementList , Elisionopt SpreadElement

Elision :
  ,
  Elision ,

SpreadElement :
  ... AssignmentExpression

@return {ParseTree}
@private