comparison trunk/src/dil/Parser.d @ 489:a7291d3ee9d7

Refactored classes that inherit from Node. Added methods addChild(), addOptChild(), addChildren(), addOptChildren() to class Node. Refactored subclasses to use the new methods instead of appending directly to the array Node.children. Moved enums StorageClass and Protection to new module dil.Enums. Added members stc, prot, isStatic() and isPulic() to Declaration.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 03 Dec 2007 22:44:27 +0100
parents cfb3805768b6
children b991f49628a8
comparison
equal deleted inserted replaced
488:cfb3805768b6 489:a7291d3ee9d7
10 import dil.Information; 10 import dil.Information;
11 import dil.Declarations; 11 import dil.Declarations;
12 import dil.Statements; 12 import dil.Statements;
13 import dil.Expressions; 13 import dil.Expressions;
14 import dil.Types; 14 import dil.Types;
15 import dil.Enums;
15 import common; 16 import common;
16 17
17 private alias TOK T; 18 private alias TOK T;
18 19
19 class ImportParser : Parser 20 class ImportParser : Parser
84 init(); 85 init();
85 auto begin = token; 86 auto begin = token;
86 auto decls = new Declarations; 87 auto decls = new Declarations;
87 if (token.type == T.Module) 88 if (token.type == T.Module)
88 decls ~= parseModuleDeclaration(); 89 decls ~= parseModuleDeclaration();
89 decls ~= parseDeclarationDefinitions(); 90 decls.addOptChildren(parseDeclarationDefinitions());
90 set(decls, begin); 91 set(decls, begin);
91 return decls; 92 return decls;
92 } 93 }
93 94
94 /++ 95 /++
2210 } 2211 }
2211 2212
2212 Statement parseCaseStatement() 2213 Statement parseCaseStatement()
2213 { 2214 {
2214 assert(token.type == T.Case); 2215 assert(token.type == T.Case);
2215 // T.Case skipped in do-while. 2216 nT();
2216 Expression[] values; 2217 auto values = parseExpressionList();
2217 do
2218 {
2219 nT();
2220 values ~= parseAssignExpression();
2221 } while (token.type == T.Comma)
2222 require(T.Colon); 2218 require(T.Colon);
2223
2224 auto caseBody = parseCaseOrDefaultBody(); 2219 auto caseBody = parseCaseOrDefaultBody();
2225 return new CaseStatement(values, caseBody); 2220 return new CaseStatement(values, caseBody);
2226 } 2221 }
2227 2222
2228 Statement parseDefaultStatement() 2223 Statement parseDefaultStatement()
3340 e = new CallExpression(e, parseArguments()); 3335 e = new CallExpression(e, parseArguments());
3341 goto Lset; 3336 goto Lset;
3342 case T.LBracket: 3337 case T.LBracket:
3343 // parse Slice- and IndexExpression 3338 // parse Slice- and IndexExpression
3344 nT(); 3339 nT();
3340 // [] is a SliceExpression
3345 if (token.type == T.RBracket) 3341 if (token.type == T.RBracket)
3346 { 3342 {
3347 e = new SliceExpression(e, null, null); 3343 e = new SliceExpression(e, null, null);
3348 break; 3344 break;
3349 } 3345 }
3350 3346
3351 Expression[] es = [parseAssignExpression()]; 3347 Expression[] es = [parseAssignExpression()];
3352 3348
3349 // [ AssignExpression .. AssignExpression ]
3353 if (token.type == T.Slice) 3350 if (token.type == T.Slice)
3354 { 3351 {
3355 nT(); 3352 nT();
3356 e = new SliceExpression(e, es[0], parseAssignExpression()); 3353 e = new SliceExpression(e, es[0], parseAssignExpression());
3357 require(T.RBracket); 3354 require(T.RBracket);
3358 goto Lset; 3355 goto Lset;
3359 } 3356 }
3360 3357
3358 // [ ExpressionList ]
3361 if (token.type == T.Comma) 3359 if (token.type == T.Comma)
3362 { 3360 {
3363 nT(); 3361 nT();
3364 es ~= parseExpressionList(); 3362 es ~= parseExpressionList();
3365 } 3363 }
3369 goto Lset; 3367 goto Lset;
3370 default: 3368 default:
3371 return e; 3369 return e;
3372 } 3370 }
3373 nT(); 3371 nT();
3374 Lset: 3372 Lset: // Jumped here to skip nT().
3375 set(e, begin); 3373 set(e, begin);
3376 } 3374 }
3377 assert(0); 3375 assert(0);
3378 } 3376 }
3379 3377
3697 nT(); 3695 nT();
3698 require(T.LParen); 3696 require(T.LParen);
3699 auto id = requireId(); 3697 auto id = requireId();
3700 TemplateArguments args; 3698 TemplateArguments args;
3701 if (token.type == T.Comma) 3699 if (token.type == T.Comma)
3702 {
3703 args = parseTemplateArguments2(); 3700 args = parseTemplateArguments2();
3704 }
3705 else 3701 else
3706 require(T.RParen); 3702 require(T.RParen);
3707 e = new TraitsExpression(id, args); 3703 e = new TraitsExpression(id, args);
3708 break; 3704 break;
3709 } 3705 }