Mercurial > projects > dil
changeset 137:b49903801f14
- Implemented parseTemplateParameters().
- Added class TemplateParameter.
author | aziz |
---|---|
date | Wed, 11 Jul 2007 12:56:02 +0000 |
parents | 96468715ea79 |
children | 91b5187ed775 |
files | trunk/src/Parser.d trunk/src/Types.d |
diffstat | 2 files changed, 131 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Parser.d Tue Jul 10 22:42:05 2007 +0000 +++ b/trunk/src/Parser.d Wed Jul 11 12:56:02 2007 +0000 @@ -1637,6 +1637,112 @@ return params; } + TemplateParameter[] parseTemplateParameters() + { + require(T.LParen); + if (token.type == T.RParen) + return null; + + TemplateParameter[] tparams; + while (1) + { + TP tp; + string ident; + Type valueType; + Type specType, defType; + Expression specValue, defValue; + + switch (token.type) + { + case T.Alias: + // TemplateAliasParameter: + // alias Identifier + tp = TP.Alias; + nT(); // Skip alias keyword. + ident = requireIdentifier(); + // : SpecializationType + if (token.type == T.Colon) + { + nT(); + specType = parseType(); + } + // = DefaultType + if (token.type == T.Assign) + { + nT(); + defType = parseType(); + } + break; + case T.Identifier: + ident = token.identifier; + Token peeked; + lx.peek(peeked); + switch (peeked.type) + { + case T.Ellipses: + // TemplateTupleParameter: + // Identifier ... + tp = TP.Tuple; + nT(); // Skip Identifier. + nT(); // Skip Ellipses. + // if (token.type == T.Comma) + // error(); // TODO: issue error msg for variadic param not being last. + break; + case T.Comma, T.RParen, T.Colon, T.Assign: + // TemplateTypeParameter: + // Identifier + tp = TP.Type; + nT(); // Skip Identifier. + // : SpecializationType + if (token.type == T.Colon) + { + nT(); + specType = parseType(); + } + // = DefaultType + if (token.type == T.Assign) + { + nT(); + defType = parseType(); + } + break; + default: + // TemplateValueParameter: + // Declarator + ident = null; + goto LTemplateValueParameter; + } + break; + default: + LTemplateValueParameter: + // TemplateValueParameter: + // Declarator + tp = TP.Value; + valueType = parseDeclarator(ident); + // : SpecializationValue + if (token.type == T.Colon) + { + nT(); + specValue = parseCondExpression(); + } + // = DefaultValue + if (token.type == T.Assign) + { + nT(); + defValue = parseCondExpression(); + } + } + + tparams ~= new TemplateParameter(tp, valueType, specType, defType, specValue, defValue); + + if (token.type != T.Comma) + break; + nT(); + } + require(T.RParen); + return tparams; + } + void expected(TOK tok) { if (token.type != tok)
--- a/trunk/src/Types.d Tue Jul 10 22:42:05 2007 +0000 +++ b/trunk/src/Types.d Wed Jul 11 12:56:02 2007 +0000 @@ -71,6 +71,31 @@ { return items.length; } } +enum TP +{ + Type, + Value, + Alias, + Tuple +} + +class TemplateParameter +{ + TP tp; + Type valueType; + Type specType, defType; + Expression specValue, defValue; + this(TP tp, Type valueType, Type specType, Type defType, Expression specValue, Expression defValue) + { + this.tp = tp; + this.valueType = valueType; + this.specType = specType; + this.defType = defType; + this.specValue = specValue; + this.defValue = defValue; + } +} + enum TID { Void = TOK.Void,