Mercurial > projects > dil
changeset 198:88c1777a9e51
- Implemented parseInitializer() and parseNonVoidInitializer().
author | aziz |
---|---|
date | Sun, 15 Jul 2007 21:35:05 +0000 |
parents | ff32eb87300e |
children | a95fee6e4b7e |
files | trunk/src/Expressions.d trunk/src/Parser.d |
diffstat | 2 files changed, 120 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Expressions.d Sun Jul 15 19:40:04 2007 +0000 +++ b/trunk/src/Expressions.d Sun Jul 15 21:35:05 2007 +0000 @@ -612,3 +612,30 @@ this.funcTok = funcTok; } } + +class VoidInitializer : Expression +{ + +} + +class ArrayInitializer : Expression +{ + Expression[] keys; + Expression[] values; + this(Expression[] keys, Expression[] values) + { + this.keys = keys; + this.values = values; + } +} + +class StructInitializer : Expression +{ + string[] idents; + Expression[] values; + this(string[] idents, Expression[] values) + { + this.idents = idents; + this.values = values; + } +}
--- a/trunk/src/Parser.d Sun Jul 15 19:40:04 2007 +0000 +++ b/trunk/src/Parser.d Sun Jul 15 21:35:05 2007 +0000 @@ -281,7 +281,99 @@ Expression parseInitializer() { - return null; + if (token.type == T.Void) + { + Token next; + lx.peek(next); + if (next.type == T.Comma || next.type == T.Semicolon) + { + nT(); + return new VoidInitializer(); + } + } + return parseNonVoidInitializer(); + } + + Expression parseNonVoidInitializer() + { + Expression init; + switch (token.type) + { + case T.LBracket: + // ArrayInitializer: + // [ ] + // [ ArrayMemberInitializations ] + Expression[] keys; + Expression[] values; + while (1) + { + auto e = parseNonVoidInitializer(); + if (token.type == T.Colon) + { + nT(); + keys ~= e; + values ~= parseNonVoidInitializer(); + } + else + { + keys ~= null; + values ~= e; + } + + if (token.type != T.Comma) + break; + nT(); + if (token.type == T.RBracket) + break; + } + require(T.RBracket); + init = new ArrayInitializer(keys, values); + break; + case T.LBrace: + // StructInitializer: + // { } + // { StructMemberInitializers } + Expression parseStructInitializer() + { + string[] idents; + Expression[] values; + while (1) + { + if (token.type == T.Identifier) + { + Token next; + lx.peek(next); + // Peek for colon to see if this is a member identifier. + if (next.type == T.Colon) + { + idents ~= token.identifier(); + nT(); + nT(); + } + } + // NonVoidInitializer + values ~= parseNonVoidInitializer(); + + if (token.type != T.Comma) + break; + nT(); + if (token.type == T.RBrace) + break; + } + require(T.RBrace); + return new StructInitializer(idents, values); + } + bool failed; + auto si = try_(parseStructInitializer(), failed); + if (!failed) + init = si; + //else + // TODO: issue error msg. + break; + default: + init = parseAssignExpression(); + } + return init; } FunctionBody parseFunctionBody(FunctionBody func)