src/Parser.cpp
changeset 187 9308d52205a0
parent 180 b98a56a533d0
child 189 eee18bf13c9b
     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