Mercurial > projects > dil
diff trunk/src/Parser.d @ 144:cfd890b250e6
- Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
- Implemented parseNewExpression().
author | aziz |
---|---|
date | Thu, 12 Jul 2007 10:24:02 +0000 |
parents | e760d7552f66 |
children | f401bd3feb2d |
line wrap: on
line diff
--- a/trunk/src/Parser.d Wed Jul 11 21:38:05 2007 +0000 +++ b/trunk/src/Parser.d Thu Jul 12 10:24:02 2007 +0000 @@ -414,14 +414,16 @@ return new ClassDeclaration(className, bases, decls, hasBody); } - BaseClass[] parseBaseClasses() + BaseClass[] parseBaseClasses(bool colonLeadsOff = true) { - assert(token.type == T.Colon); + if (colonLeadsOff) + { + assert(token.type == T.Colon); + nT(); // Skip colon + } BaseClass[] bases; - nT(); // Skip colon - while (1) { Protection prot = Protection.Public; @@ -1438,8 +1440,42 @@ Expression parseNewExpression(Expression e) { - // TODO: implement this method. - return null; + assert(token.type == T.New); + nT(); // Skip new keyword. + + Expression[] newArguments; + Expression[] ctorArguments; + + if (token.type == T.LParen) + newArguments = parseArguments(T.RParen); + + // NewAnonClassExpression: + // new (ArgumentList)opt class (ArgumentList)opt SuperClassopt InterfaceClassesopt ClassBody + if (token.type == T.Class) + { + nT(); + if (token.type == T.LParen) + ctorArguments = parseArguments(T.RParen); + + BaseClass[] bases = token.type != T.LBrace ? parseBaseClasses(false) : null ; + + require(T.LBrace); + auto decls = parseDeclarationDefinitions(); + require(T.RBrace); + return new NewAnonClassExpression(e, newArguments, bases, ctorArguments, decls); + } + + // NewExpression: + // NewArguments Type [ AssignExpression ] + // NewArguments Type ( ArgumentList ) + // NewArguments Type + auto type = parseType(); + // TODO: consider "new Foo!(int)(1,2,3)" + if (type.tid == TID.Identifier) + { + ctorArguments = parseArguments(T.RParen); + } + return new NewExpression(e, newArguments, type, ctorArguments); } Type parseType()