# HG changeset patch # User aziz # Date 1183645205 0 # Node ID d8dc3171440d8bdaae4e07b902273ff29158908a # Parent ac8d961d10d1ec6e10238f5c1003b18dbd7c9f08 - Fixed parsing CallExpression and IndexExpression. - Implemented parsing of ArrayLiteral- and AssocArrayLiteralExpressions. - Added classes ArrayLiteralExpression and AssocArrayLiteralExpression. diff -r ac8d961d10d1 -r d8dc3171440d trunk/src/Expressions.d --- a/trunk/src/Expressions.d Thu Jul 05 10:35:04 2007 +0000 +++ b/trunk/src/Expressions.d Thu Jul 05 14:20:05 2007 +0000 @@ -411,6 +411,23 @@ { this.str = str; } } +class ArrayLiteralExpression : Expression +{ + Expression[] values; + this(Expression[] values) + { this.values = values; } +} + +class AssocArrayLiteralExpression : Expression +{ + Expression[] keys, values; + this(Expression[] keys, Expression[] values) + { + this.keys = keys; + this.values = values; + } +} + class AssertExpression { diff -r ac8d961d10d1 -r d8dc3171440d trunk/src/Parser.d --- a/trunk/src/Parser.d Thu Jul 05 10:35:04 2007 +0000 +++ b/trunk/src/Parser.d Thu Jul 05 14:20:05 2007 +0000 @@ -296,7 +296,6 @@ e = new PostDecrExpression(e); break; case T.LParen: - nT(); e = new CallExpression(e, parseArgumentList(T.LParen)); break; case T.LBracket: @@ -322,10 +321,11 @@ { es ~= parseArgumentList(T.RBracket); } +// else if (lx.token.type != T.RBracket) +// error(); + else + nT(); e = new IndexExpression(e, es); -// if (lx.token.type != T.RBracket) -// error(); - nT(); break; } } @@ -437,6 +437,53 @@ e = new StringLiteralExpression(buffer); break; case T.LBracket: + Expression[] values; + + nT(); + if (lx.token.type != T.RBracket) + { + e = parseAssignExpression(); + if (lx.token.type == T.Colon) + goto LparseAssocArray; + else if (lx.token.type == T.Comma) + values = [e] ~ parseArgumentList(T.RBracket); +// else if (lx.token.type != T.RBracket) +// error(); + } + + e = new ArrayLiteralExpression(values); + break; + + LparseAssocArray: + Expression[] keys; + + keys ~= e; + nT(); // Skip colon. + values ~= parseAssignExpression(); + + if (lx.token.type != T.RBracket) + while (1) + { + keys ~= parseAssignExpression(); + if (lx.token.type != T.Colon) + { +// error(); + values ~= null; + if (lx.token.type == T.RBracket) + break; + else + continue; + } + nT(); + values ~= parseAssignExpression(); + if (lx.token.type == T.RBracket) + break; +// if (lx.token.type != T.Comma) +// error(); + } + assert(lx.token.type == T.RBracket); + nT(); + e = new AssocArrayLiteralExpression(keys, values); break; case T.LBrace: break;