Mercurial > projects > dil
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 } |