Mercurial > projects > dil
changeset 133:3924b1ee1302
- Added code for parsing function and delegate literal expressions.
author | aziz |
---|---|
date | Tue, 10 Jul 2007 21:10:04 +0000 |
parents | c97a3f683d13 |
children | a31aa0d6dd5e |
files | trunk/src/Expressions.d trunk/src/Parser.d |
diffstat | 2 files changed, 26 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Expressions.d Tue Jul 10 20:13:04 2007 +0000 +++ b/trunk/src/Expressions.d Tue Jul 10 21:10:04 2007 +0000 @@ -543,9 +543,12 @@ { FunctionType func; Declaration[] decls; - this(FunctionType func, Declaration[] decls) + TOK funcTok; + + this(FunctionType func, Declaration[] decls, TOK funcTok = TOK.Invalid) { this.func = func; this.decls = decls; + this.funcTok = funcTok; } }
--- a/trunk/src/Parser.d Tue Jul 10 20:13:04 2007 +0000 +++ b/trunk/src/Parser.d Tue Jul 10 21:10:04 2007 +0000 @@ -1244,14 +1244,30 @@ e = new AssocArrayLiteralExpression(keys, values); break; case T.LBrace: - // TODO: parse delegate literals: FunctionBody + // DelegateLiteral := { DeclDefs } + require(T.LBrace); + auto decls = parseDeclarationDefinitions(); + require(T.RBrace); + auto func = new FunctionType(null, Parameters.init); + e = new FunctionLiteralExpression(func, decls); break; case T.Function, T.Delegate: - // TODO: parse delegate/function literals: - // function Type? ( ArgumentList ) FunctionBody - // function FunctionBody - // delegate Type? ( ArgumentList ) FunctionBody - // delegate FunctionBody + // FunctionLiteral := (function|delegate) Type? '(' ArgumentList ')' '{' DeclDefs '}' + TOK funcTok = token.type; + nT(); // Skip function|delegate token. + Type returnType; + Parameters parameters; + if (token.type != T.LBrace) + { + if (token.type != T.LParen) // Optional return type + returnType = parseType(); + parameters = parseParameters(); + } + require(T.LBrace); + auto decls = parseDeclarationDefinitions(); + require(T.RBrace); + auto func = new FunctionType(returnType, parameters); + e = new FunctionLiteralExpression(func, decls, funcTok); break; case T.Assert: Expression msg;