Mercurial > projects > dil
comparison trunk/src/Parser.d @ 151:2e959f67000b
- Added code for parsing mixin expression declarations.
author | aziz |
---|---|
date | Thu, 12 Jul 2007 19:18:02 +0000 |
parents | 753bc07bf3a0 |
children | fe2e36eb4b45 |
comparison
equal
deleted
inserted
replaced
150:753bc07bf3a0 | 151:2e959f67000b |
---|---|
912 return new DeleteDeclaration(parameters, decls); | 912 return new DeleteDeclaration(parameters, decls); |
913 } | 913 } |
914 | 914 |
915 /* | 915 /* |
916 TemplateMixin: | 916 TemplateMixin: |
917 mixin ( AssignExpression ) ; | |
917 mixin TemplateIdentifier ; | 918 mixin TemplateIdentifier ; |
918 mixin TemplateIdentifier MixinIdentifier ; | 919 mixin TemplateIdentifier MixinIdentifier ; |
919 mixin TemplateIdentifier !( TemplateArgumentList ) ; | 920 mixin TemplateIdentifier !( TemplateArgumentList ) ; |
920 mixin TemplateIdentifier !( TemplateArgumentList ) MixinIdentifier ; | 921 mixin TemplateIdentifier !( TemplateArgumentList ) MixinIdentifier ; |
921 */ | 922 */ |
922 Declaration parseMixinDeclaration() | 923 Declaration parseMixinDeclaration() |
923 { | 924 { |
924 assert(token.type == T.Mixin); | 925 assert(token.type == T.Mixin); |
925 nT(); // Skip mixin keyword. | 926 nT(); // Skip mixin keyword. |
926 | 927 |
928 if (token.type == T.LParen) | |
929 { | |
930 // TODO: What about mixin(...).ident;? | |
931 nT(); | |
932 auto e = parseAssignExpression(); | |
933 require(T.RParen); | |
934 require(T.Semicolon); | |
935 return new MixinDeclaration(e); | |
936 } | |
937 | |
927 Expression[] templateIdent; | 938 Expression[] templateIdent; |
928 string mixinIdent; | 939 string mixinIdent; |
929 | 940 |
930 if (token.type == T.Dot) | 941 if (token.type == T.Dot) |
931 { | 942 { |
936 while (1) | 947 while (1) |
937 { | 948 { |
938 string ident = requireIdentifier(); | 949 string ident = requireIdentifier(); |
939 if (token.type == T.Not) // Identifier !( TemplateArguments ) | 950 if (token.type == T.Not) // Identifier !( TemplateArguments ) |
940 { | 951 { |
941 // No need to peek for T.RParen. This must be a template instance. | 952 // No need to peek for T.LParen. This must be a template instance. |
942 nT(); | 953 nT(); |
943 templateIdent ~= new TemplateInstanceExpression(ident, parseTemplateArguments()); | 954 templateIdent ~= new TemplateInstanceExpression(ident, parseTemplateArguments()); |
944 } | 955 } |
945 else // Identifier | 956 else // Identifier |
946 templateIdent ~= new IdentifierExpression(ident); | 957 templateIdent ~= new IdentifierExpression(ident); |