private ParseNode parseArray() {
    List<Object[]> rowsData = new ArrayList<Object[]>();
    while (true) {
      Object[] singleRowData = parseArrayRow();
      rowsData.add(singleRowData);
      if (look == '}') {
        break;
      }
      if (look != ';') {
        throw expected("'}' or ';'");
      }
      Match(';');
    }
    int nRows = rowsData.size();
    Object[][] values2d = new Object[nRows][];
    rowsData.toArray(values2d);
    int nColumns = values2d[0].length;
    checkRowLengths(values2d, nColumns);

    return new ParseNode(new ArrayPtg(values2d));
  }