diff -r 6c1cc50c4808 -r 443d24cfdf2d src/compiler/Parser.cpp --- a/src/compiler/Parser.cpp Sat Nov 17 23:13:39 2012 -0800 +++ b/src/compiler/Parser.cpp Sun Nov 18 14:53:23 2012 -0800 @@ -139,30 +139,21 @@ } Expression * -Parser::arrayLiteral(TokenKind kind) +Parser::fixedArrayLiteral() { - assert(kind == TOK_LBRACE || kind == TOK_LBRACKET); - - TokenKind close = (kind == TOK_LBRACE) - ? TOK_RBRACE - : TOK_RBRACKET; - SourcePosition pos = scanner_.begin(); ExpressionList *list = new (pool_) ExpressionList(); do { - if (match(close)) + // { } is an illegal array literal. + if (list->length() > 0 && match(TOK_LBRACE)) break; Expression *expr = NULL; - if (kind == TOK_LBRACE) { - if (peek(TOK_LBRACE)) - expr = arrayLiteral(TOK_LBRACE); - else - expr = primitive(); - } else { - expr = expression(); - } + if (peek(TOK_LBRACE)) + expr = fixedArrayLiteral(); + else + expr = primitive(); if (!expr) return NULL; @@ -170,13 +161,13 @@ return NULL; if (!match(TOK_COMMA)) { - if (!expect(close)) + if (!expect(TOK_RBRACE)) return NULL; break; } } while (true); - return new (pool_) ArrayLiteral(pos, kind, list); + return new (pool_) ArrayLiteral(pos, TOK_LBRACE, list); } Expression * @@ -882,7 +873,7 @@ return NULL; ExpressionList *dims = NULL; - if (match(TOK_LBRACE)) { + if (peek(TOK_LBRACKET)) { if ((dims = dimensions()) == NULL) return NULL;; } @@ -894,7 +885,8 @@ switch (scanner_.peek()) { // Note: we don't support [] literals yet. case TOK_LBRACE: - if ((expr = arrayLiteral(scanner_.scan())) == NULL) + scanner_.scan(); + if ((expr = fixedArrayLiteral()) == NULL) return NULL; break;