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)); }