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