Mercurial > projects > dil
comparison trunk/src/dil/Parser.d @ 335:b245b234fdd9
- Moved parsePostExpression() above parseUnaryExpression().
- parseMulExpression() calls parsePostExpression() now.
author | aziz |
---|---|
date | Wed, 22 Aug 2007 09:51:02 +0000 |
parents | a48a987f7515 |
children | 1accb3013bd2 |
comparison
equal
deleted
inserted
replaced
334:ca8ad7c34d6a | 335:b245b234fdd9 |
---|---|
3093 assert(0); | 3093 assert(0); |
3094 } | 3094 } |
3095 | 3095 |
3096 Expression parseMulExpression() | 3096 Expression parseMulExpression() |
3097 { | 3097 { |
3098 alias parsePostExpression parseNext; | |
3099 auto begin = token; | |
3100 auto e = parseNext(); | |
3101 while (1) | |
3102 { | |
3103 auto operator = token; | |
3104 switch (operator.type) | |
3105 { | |
3106 case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break; | |
3107 case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break; | |
3108 case T.Mod: nT(); e = new ModExpression(e, parseNext(), operator); break; | |
3109 default: | |
3110 return e; | |
3111 } | |
3112 set(e, begin); | |
3113 } | |
3114 assert(0); | |
3115 } | |
3116 | |
3117 Expression parsePostExpression() | |
3118 { | |
3098 auto begin = token; | 3119 auto begin = token; |
3099 auto e = parseUnaryExpression(); | 3120 auto e = parseUnaryExpression(); |
3100 while (1) | 3121 while (1) |
3101 { | 3122 { |
3102 auto operator = token; | |
3103 switch (operator.type) | |
3104 { | |
3105 case T.Mul: nT(); e = new MulExpression(e, parseUnaryExpression(), operator); break; | |
3106 case T.Div: nT(); e = new DivExpression(e, parseUnaryExpression(), operator); break; | |
3107 case T.Mod: nT(); e = new ModExpression(e, parseUnaryExpression(), operator); break; | |
3108 default: | |
3109 return e; | |
3110 } | |
3111 set(e, begin); | |
3112 } | |
3113 assert(0); | |
3114 } | |
3115 | |
3116 Expression parseUnaryExpression() | |
3117 { | |
3118 auto begin = token; | |
3119 Expression e; | |
3120 switch (token.type) | |
3121 { | |
3122 case T.AndBinary: | |
3123 nT(); | |
3124 e = new AddressExpression(parseUnaryExpression()); | |
3125 break; | |
3126 case T.PlusPlus: | |
3127 nT(); | |
3128 e = new PreIncrExpression(parseUnaryExpression()); | |
3129 break; | |
3130 case T.MinusMinus: | |
3131 nT(); | |
3132 e = new PreDecrExpression(parseUnaryExpression()); | |
3133 break; | |
3134 case T.Mul: | |
3135 nT(); | |
3136 e = new DerefExpression(parseUnaryExpression()); | |
3137 break; | |
3138 case T.Minus: | |
3139 case T.Plus: | |
3140 nT(); | |
3141 e = new SignExpression(parseUnaryExpression()); | |
3142 break; | |
3143 case T.Not: | |
3144 nT(); | |
3145 e = new NotExpression(parseUnaryExpression()); | |
3146 break; | |
3147 case T.Tilde: | |
3148 nT(); | |
3149 e = new CompExpression(parseUnaryExpression()); | |
3150 break; | |
3151 case T.New: | |
3152 e = parseNewExpression(); | |
3153 return e; | |
3154 case T.Delete: | |
3155 nT(); | |
3156 e = new DeleteExpression(parseUnaryExpression()); | |
3157 break; | |
3158 case T.Cast: | |
3159 requireNext(T.LParen); | |
3160 Type type; | |
3161 switch (token.type) | 3123 switch (token.type) |
3162 { | 3124 { |
3163 version(D2) | |
3164 { | |
3165 auto begin2 = token; | |
3166 case T.Const: | |
3167 type = new ConstType(null); | |
3168 goto case_break; | |
3169 case T.Invariant: | |
3170 type = new InvariantType(null); | |
3171 case_break: | |
3172 nT(); | |
3173 set(type, begin2); | |
3174 break; | |
3175 } | |
3176 default: | |
3177 type = parseType(); | |
3178 } | |
3179 require(T.RParen); | |
3180 e = new CastExpression(parseUnaryExpression(), type); | |
3181 break; | |
3182 case T.LParen: | |
3183 // ( Type ) . Identifier | |
3184 Type parseType_() | |
3185 { | |
3186 nT(); | |
3187 auto type = parseType(); | |
3188 require(T.RParen); | |
3189 require(T.Dot); | |
3190 return type; | |
3191 } | |
3192 bool success; | |
3193 auto type = try_(parseType_(), success); | |
3194 if (success) | |
3195 { | |
3196 auto ident = requireId(); | |
3197 e = new TypeDotIdExpression(type, ident); | |
3198 break; | |
3199 } | |
3200 goto default; | |
3201 default: | |
3202 e = parsePostExpression(parsePrimaryExpression()); | |
3203 return e; | |
3204 } | |
3205 assert(e !is null); | |
3206 set(e, begin); | |
3207 return e; | |
3208 } | |
3209 | |
3210 Expression parsePostExpression(Expression e) | |
3211 { | |
3212 typeof(token) begin; | |
3213 while (1) | |
3214 { | |
3215 begin = token; | |
3216 switch (token.type) | |
3217 { | |
3218 /* | |
3219 // Commented out because parseDotListExpression() handles this. | |
3220 case T.Dot: | |
3221 nT(); | |
3222 if (token.type == T.Identifier) | |
3223 { | |
3224 string ident = token.identifier; | |
3225 nT(); | |
3226 if (token.type == T.Not && peekNext() == T.LParen) // Identifier !( TemplateArguments ) | |
3227 { | |
3228 nT(); // Skip !. | |
3229 e = new DotTemplateInstanceExpression(e, ident, parseTemplateArguments()); | |
3230 } | |
3231 else | |
3232 { | |
3233 e = new DotIdExpression(e, ident); | |
3234 nT(); | |
3235 } | |
3236 } | |
3237 else if (token.type == T.New) | |
3238 e = parseNewExpression(e); | |
3239 else | |
3240 expected(T.Identifier); | |
3241 continue; | |
3242 */ | |
3243 case T.Dot: | 3125 case T.Dot: |
3244 e = new PostDotListExpression(e, parseDotListExpression()); | 3126 e = new PostDotListExpression(e, parseDotListExpression()); |
3245 goto Lset; | 3127 goto Lset; |
3246 case T.PlusPlus: | 3128 case T.PlusPlus: |
3247 e = new PostIncrExpression(e); | 3129 e = new PostIncrExpression(e); |
3287 set(e, begin); | 3169 set(e, begin); |
3288 } | 3170 } |
3289 assert(0); | 3171 assert(0); |
3290 } | 3172 } |
3291 | 3173 |
3292 Expression parsePrimaryExpression() | 3174 Expression parseUnaryExpression() |
3293 { | 3175 { |
3294 auto begin = token; | 3176 auto begin = token; |
3295 Expression e; | 3177 Expression e; |
3296 switch (token.type) | 3178 switch (token.type) |
3297 { | 3179 { |
3298 /* | 3180 case T.AndBinary: |
3299 // Commented out because parseDotListExpression() handles this. | 3181 nT(); |
3300 case T.Identifier: | 3182 e = new AddressExpression(parseUnaryExpression()); |
3301 string ident = token.identifier; | 3183 break; |
3302 nT(); | 3184 case T.PlusPlus: |
3303 if (token.type == T.Not && peekNext() == T.LParen) // Identifier !( TemplateArguments ) | 3185 nT(); |
3304 { | 3186 e = new PreIncrExpression(parseUnaryExpression()); |
3305 nT(); // Skip !. | 3187 break; |
3306 e = new TemplateInstanceExpression(ident, parseTemplateArguments()); | 3188 case T.MinusMinus: |
3307 } | 3189 nT(); |
3308 else | 3190 e = new PreDecrExpression(parseUnaryExpression()); |
3309 e = new IdentifierExpression(ident); | 3191 break; |
3310 break; | 3192 case T.Mul: |
3311 case T.Dot: | 3193 nT(); |
3312 nT(); | 3194 e = new DerefExpression(parseUnaryExpression()); |
3313 e = new IdentifierExpression("."); | 3195 break; |
3314 break; | 3196 case T.Minus: |
3315 */ | 3197 case T.Plus: |
3198 nT(); | |
3199 e = new SignExpression(parseUnaryExpression()); | |
3200 break; | |
3201 case T.Not: | |
3202 nT(); | |
3203 e = new NotExpression(parseUnaryExpression()); | |
3204 break; | |
3205 case T.Tilde: | |
3206 nT(); | |
3207 e = new CompExpression(parseUnaryExpression()); | |
3208 break; | |
3209 case T.New: | |
3210 e = parseNewExpression(); | |
3211 return e; | |
3212 case T.Delete: | |
3213 nT(); | |
3214 e = new DeleteExpression(parseUnaryExpression()); | |
3215 break; | |
3216 case T.Cast: | |
3217 requireNext(T.LParen); | |
3218 Type type; | |
3219 switch (token.type) | |
3220 { | |
3221 version(D2) | |
3222 { | |
3223 auto begin2 = token; | |
3224 case T.Const: | |
3225 type = new ConstType(null); | |
3226 goto case_break; | |
3227 case T.Invariant: | |
3228 type = new InvariantType(null); | |
3229 case_break: | |
3230 nT(); | |
3231 set(type, begin2); | |
3232 break; | |
3233 } | |
3234 default: | |
3235 type = parseType(); | |
3236 } | |
3237 require(T.RParen); | |
3238 e = new CastExpression(parseUnaryExpression(), type); | |
3239 break; | |
3240 case T.LParen: | |
3241 // ( Type ) . Identifier | |
3242 Type parseType_() | |
3243 { | |
3244 nT(); | |
3245 auto type = parseType(); | |
3246 require(T.RParen); | |
3247 require(T.Dot); | |
3248 return type; | |
3249 } | |
3250 bool success; | |
3251 auto type = try_(parseType_(), success); | |
3252 if (success) | |
3253 { | |
3254 auto ident = requireId(); | |
3255 e = new TypeDotIdExpression(type, ident); | |
3256 break; | |
3257 } | |
3258 goto default; | |
3259 default: | |
3260 e = parsePrimaryExpression(); | |
3261 return e; | |
3262 } | |
3263 assert(e !is null); | |
3264 set(e, begin); | |
3265 return e; | |
3266 } | |
3267 | |
3268 Expression parsePrimaryExpression() | |
3269 { | |
3270 auto begin = token; | |
3271 Expression e; | |
3272 switch (token.type) | |
3273 { | |
3316 case T.Identifier, T.Dot, T.Typeof: | 3274 case T.Identifier, T.Dot, T.Typeof: |
3317 e = parseDotListExpression(); | 3275 e = parseDotListExpression(); |
3318 break; | 3276 break; |
3319 case T.This: | 3277 case T.This: |
3320 nT(); | 3278 nT(); |
3445 requireNext(T.LParen); | 3403 requireNext(T.LParen); |
3446 auto type = parseType(); | 3404 auto type = parseType(); |
3447 require(T.RParen); | 3405 require(T.RParen); |
3448 e = new TypeidExpression(type); | 3406 e = new TypeidExpression(type); |
3449 break; | 3407 break; |
3450 /* | |
3451 // Commented out because parseDotListExpression() handles this. | |
3452 case T.Typeof: | |
3453 requireNext(T.LParen); | |
3454 auto type = new TypeofType(parseExpression()); | |
3455 require(T.RParen); | |
3456 if (token.type == T.Dot) | |
3457 { // typeof ( Expression ) . Identifier | |
3458 nT(); | |
3459 string ident = requireIdentifier; | |
3460 e = new TypeDotIdExpression(type, ident); | |
3461 } | |
3462 else // typeof ( Expression ) | |
3463 e = new TypeofExpression(type); | |
3464 break; | |
3465 */ | |
3466 case T.Is: | 3408 case T.Is: |
3467 requireNext(T.LParen); | 3409 requireNext(T.LParen); |
3468 | 3410 |
3469 Type type, specType; | 3411 Type type, specType; |
3470 Token* ident; // optional Identifier | 3412 Token* ident; // optional Identifier |