1.1 --- a/src/Parser.cpp Sat Sep 15 19:33:24 2012 -0700
1.2 +++ b/src/Parser.cpp Sun Sep 16 19:02:23 2012 -0700
1.3 @@ -128,14 +128,6 @@
1.4 {
1.5 TokenKind kind = scanner_.peek();
1.6 switch (kind) {
1.7 - case TOK_NAME:
1.8 - {
1.9 - Local<String> name(zone_, expectName());
1.10 - if (!name)
1.11 - return NULL;
1.12 - return bind(name);
1.13 - }
1.14 -
1.15 case TOK_FLOAT_LITERAL:
1.16 {
1.17 scanner_.scan();
1.18 @@ -182,6 +174,47 @@
1.19 }
1.20
1.21 Expression *
1.22 +Parser::arrayLiteral(TokenKind kind)
1.23 +{
1.24 + assert(kind == TOK_LBRACE || kind == TOK_LBRACKET);
1.25 +
1.26 + TokenKind close = (kind == TOK_LBRACE)
1.27 + ? TOK_RBRACE
1.28 + : TOK_RBRACKET;
1.29 +
1.30 + SourcePosition pos = scanner_.begin();
1.31 +
1.32 + ExpressionList *list = new (pool_) ExpressionList();
1.33 + do {
1.34 + if (match(close))
1.35 + break;
1.36 +
1.37 + Expression *expr = NULL;
1.38 + if (kind == TOK_LBRACE) {
1.39 + if (peek(TOK_LBRACE))
1.40 + expr = arrayLiteral(TOK_LBRACE);
1.41 + else
1.42 + expr = primitive();
1.43 + } else {
1.44 + expr = expression();
1.45 + }
1.46 + if (!expr)
1.47 + return NULL;
1.48 +
1.49 + if (!list->append(expr))
1.50 + return NULL;
1.51 +
1.52 + if (!match(TOK_COMMA)) {
1.53 + if (!expect(close))
1.54 + return NULL;
1.55 + break;
1.56 + }
1.57 + } while (true);
1.58 +
1.59 + return new (pool_) ArrayLiteral(pos, kind, list);
1.60 +}
1.61 +
1.62 +Expression *
1.63 Parser::prefix()
1.64 {
1.65 switch (scanner_.peek()) {
1.66 @@ -196,6 +229,14 @@
1.67 return expr;
1.68 }
1.69
1.70 + case TOK_NAME:
1.71 + {
1.72 + Local<String> name(zone_, expectName());
1.73 + if (!name)
1.74 + return NULL;
1.75 + return bind(name);
1.76 + }
1.77 +
1.78 default:
1.79 return primitive();
1.80 }
1.81 @@ -844,8 +885,18 @@
1.82
1.83 Expression *expr = NULL;
1.84 if (match(TOK_ASSIGN)) {
1.85 - if ((expr = expression()) == NULL)
1.86 - return NULL;
1.87 + switch (scanner_.peek()) {
1.88 + // Note: we don't support [] literals yet.
1.89 + case TOK_LBRACE:
1.90 + if ((expr = arrayLiteral(scanner_.scan())) == NULL)
1.91 + return NULL;
1.92 + break;
1.93 +
1.94 + default:
1.95 + if ((expr = expression()) == NULL)
1.96 + return NULL;
1.97 + break;
1.98 + }
1.99 }
1.100
1.101 return new (pool_) VariableDeclaration(var->pos(), kind, var, type, postDimensions, expr);
1.102 @@ -1718,6 +1769,17 @@
1.103 node->defaultCase()->accept(this);
1.104 unindent();
1.105 }
1.106 + void visit(ArrayLiteral *node) {
1.107 + prefix();
1.108 + fprintf(fp_, "[ ArrayLiteral\n");
1.109 + indent();
1.110 + for (size_t i = 0; i < node->expressions()->length(); i++) {
1.111 + Expression *expr = node->expressions()->at(i);
1.112 + indent();
1.113 + expr->accept(this);
1.114 + unindent();
1.115 + }
1.116 + }
1.117 };
1.118
1.119 void