comparison trunk/src/dil/Parser.d @ 340:1accb3013bd2

- Changed class TemplateParameter to an abstract class. - Added classes TemplateAlias-, Type-, Value- and TupleParameter.
author aziz
date Wed, 22 Aug 2007 19:50:01 +0000
parents b245b234fdd9
children 3ac651ea83fb
comparison
equal deleted inserted replaced
339:9954367bcd4b 340:1accb3013bd2
3969 { 3969 {
3970 auto begin = token; 3970 auto begin = token;
3971 auto tparams = new TemplateParameters; 3971 auto tparams = new TemplateParameters;
3972 3972
3973 require(T.LParen); 3973 require(T.LParen);
3974 if (token.type == T.RParen) 3974 if (token.type != T.RParen)
3975 return tparams;
3976
3977 while (1) 3975 while (1)
3978 { 3976 {
3979 auto paramBegin = token; 3977 auto paramBegin = token;
3980 TP tp; 3978 TemplateParameter tp;
3981 Token* ident; 3979 Token* ident;
3982 Type valueType;
3983 Type specType, defType; 3980 Type specType, defType;
3984 Expression specValue, defValue; 3981
3985 3982 void parseSpecAndOrDefaultType()
3986 switch (token.type) 3983 {
3987 {
3988 case T.Alias:
3989 // TemplateAliasParameter:
3990 // alias Identifier
3991 tp = TP.Alias;
3992 nT(); // Skip alias keyword.
3993 ident = requireId();
3994 // : SpecializationType 3984 // : SpecializationType
3995 if (token.type == T.Colon) 3985 if (token.type == T.Colon)
3996 { 3986 {
3997 nT(); 3987 nT();
3998 specType = parseType(); 3988 specType = parseType();
4001 if (token.type == T.Assign) 3991 if (token.type == T.Assign)
4002 { 3992 {
4003 nT(); 3993 nT();
4004 defType = parseType(); 3994 defType = parseType();
4005 } 3995 }
3996 }
3997
3998 switch (token.type)
3999 {
4000 case T.Alias:
4001 // TemplateAliasParameter:
4002 // alias Identifier
4003 nT(); // Skip alias keyword.
4004 ident = requireId();
4005 parseSpecAndOrDefaultType();
4006 tp = new TemplateAliasParameter(ident, specType, defType);
4006 break; 4007 break;
4007 case T.Identifier: 4008 case T.Identifier:
4008 ident = token; 4009 ident = token;
4009 switch (peekNext()) 4010 switch (peekNext())
4010 { 4011 {
4011 case T.Ellipses: 4012 case T.Ellipses:
4012 // TemplateTupleParameter: 4013 // TemplateTupleParameter:
4013 // Identifier ... 4014 // Identifier ...
4014 tp = TP.Tuple;
4015 nT(); // Skip Identifier. 4015 nT(); // Skip Identifier.
4016 nT(); // Skip Ellipses. 4016 nT(); // Skip Ellipses.
4017 // if (token.type == T.Comma) 4017 // if (token.type == T.Comma)
4018 // error(); // TODO: issue error msg for variadic param not being last. 4018 // error(); // TODO: issue error msg for variadic param not being last.
4019 tp = new TemplateTupleParameter(ident);
4019 break; 4020 break;
4020 case T.Comma, T.RParen, T.Colon, T.Assign: 4021 case T.Comma, T.RParen, T.Colon, T.Assign:
4021 // TemplateTypeParameter: 4022 // TemplateTypeParameter:
4022 // Identifier 4023 // Identifier
4023 tp = TP.Type;
4024 nT(); // Skip Identifier. 4024 nT(); // Skip Identifier.
4025 // : SpecializationType 4025 parseSpecAndOrDefaultType();
4026 if (token.type == T.Colon) 4026 tp = new TemplateAliasParameter(ident, specType, defType);
4027 {
4028 nT();
4029 specType = parseType();
4030 }
4031 // = DefaultType
4032 if (token.type == T.Assign)
4033 {
4034 nT();
4035 defType = parseType();
4036 }
4037 break; 4027 break;
4038 default: 4028 default:
4039 // TemplateValueParameter: 4029 // TemplateValueParameter:
4040 // Declarator 4030 // Declarator
4041 ident = null; 4031 ident = null;
4044 break; 4034 break;
4045 default: 4035 default:
4046 LTemplateValueParameter: 4036 LTemplateValueParameter:
4047 // TemplateValueParameter: 4037 // TemplateValueParameter:
4048 // Declarator 4038 // Declarator
4049 tp = TP.Value; 4039 Expression specValue, defValue;
4050 valueType = parseDeclarator(ident); 4040 auto valueType = parseDeclarator(ident);
4051 // : SpecializationValue 4041 // : SpecializationValue
4052 if (token.type == T.Colon) 4042 if (token.type == T.Colon)
4053 { 4043 {
4054 nT(); 4044 nT();
4055 specValue = parseCondExpression(); 4045 specValue = parseCondExpression();
4058 if (token.type == T.Assign) 4048 if (token.type == T.Assign)
4059 { 4049 {
4060 nT(); 4050 nT();
4061 defValue = parseCondExpression(); 4051 defValue = parseCondExpression();
4062 } 4052 }
4063 } 4053 tp = new TemplateValueParameter(valueType, ident, specValue, defValue);
4064 4054 }
4065 tparams ~= set(new TemplateParameter(tp, valueType, ident, specType, defType, specValue, defValue), paramBegin); 4055
4056 // Push template parameter.
4057 tparams ~= set(tp, paramBegin);
4066 4058
4067 if (token.type != T.Comma) 4059 if (token.type != T.Comma)
4068 break; 4060 break;
4069 nT(); 4061 nT();
4070 } 4062 }