Mercurial > projects > dang
annotate src/parser/Parser.d @ 207:e0551773a005
Added the correct version.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 12 Aug 2008 18:19:34 +0200 |
parents | d3c148ca429b |
children | 42e663451371 |
rev | line source |
---|---|
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1 module parser.Parser; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
2 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
3 import lexer.Lexer, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
4 lexer.Token; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
5 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
6 import parser.Action; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
7 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
8 import basic.Message, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
9 basic.Attribute; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
10 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
11 import basic.SmallArray, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
12 basic.SourceManager; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
13 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
14 import tango.io.Stdout, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
15 Integer = tango.text.convert.Integer; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
16 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
17 class Parser |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
18 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
19 Action action; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
20 MessageHandler messages; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
21 alias Object Exp; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
22 alias Object Stmt; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
23 alias Object Decl; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
24 alias Object Module; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
25 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
26 this(MessageHandler messages) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
27 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
28 this.messages = messages; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
29 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
30 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
31 Module parse(SourceManager sm, Lexer lexer, Action act) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
32 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
33 this.sm = sm; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
34 this.lexer = lexer; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
35 this.action = act; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
36 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
37 Module m; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
38 if (peek.type == Tok.Module) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
39 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
40 Token _module = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
41 ModuleName name = parseModuleName(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
42 m = action.actOnModule(_module, sm.getText(name.asRange())); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
43 require(Tok.Seperator); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
44 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
45 else |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
46 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
47 SLoc loc = peek.location; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
48 m = action.actOnImplicitModule(loc, sm.getFile(loc)); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
49 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
50 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
51 auto nes = parseAttributeInit; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
52 while( !isa(Tok.EOF) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
53 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
54 while ( peek.isAttribute ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
55 nes ~= parseAttribute(nes[$-1]); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
56 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
57 foreach (d; parseDeclDef(nes[$-1].a)) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
58 action.actOnModuleDecl(m, d); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
59 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
60 nes = parseAttributeScope(nes); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
61 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
62 |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
63 return m; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
64 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
65 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
66 private: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
67 Decl[] parseDeclDef(Attribute a) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
68 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
69 if ( isa (Tok.Import) ) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
70 return parseImports(); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
71 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
72 return [parseDecl(a)]; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
73 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
74 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
75 Decl parseDecl(Attribute att) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
76 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
77 switch(peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
78 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
79 case Tok.Struct: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
80 Id type = Id(next()); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
81 Id iden = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
82 return parseStruct(type, iden, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
83 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
84 case Tok.Class: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
85 Id type = Id(next()); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
86 Id iden = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
87 return parseClass(type, iden, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
88 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
89 case Tok.Interface: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
90 Id type = Id(next()); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
91 Id iden = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
92 return parseInterface(type, iden, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
93 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
94 case Tok.Alias: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
95 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
96 auto decl = parseDecl(Attribute()); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
97 return action.actOnAliasDecl(decl, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
98 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
99 case Tok.Identifier: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
100 Id type = parseType; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
101 Id iden = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
102 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
103 switch(peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
104 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
105 case Tok.Seperator: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
106 Token sep = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
107 return action.actOnDeclarator(type, iden, null, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
108 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
109 case Tok.Assign: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
110 Token assign = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
111 Exp exp = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
112 require(Tok.Seperator); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
113 return action.actOnDeclarator(type, iden, exp, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
114 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
115 case Tok.OpenParentheses: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
116 return parseFunc(type, iden, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
117 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
118 default: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
119 auto n1 = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
120 isEOF(type.tok); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
121 messages.report(UnexpectedTok, n1.location).arg(n1.get(sm)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
122 return action.actOnDeclarator(type, iden, null, att); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
123 } |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
124 messages.report(InvalidDeclType, peek.location) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
125 .arg(sm.getText(peek.asRange)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
126 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
127 default: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
128 if (peek.isBasicType) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
129 goto case Tok.Identifier; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
130 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
131 messages.report(UnexpectedTok, peek.location) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
132 .arg(sm.getText(peek.asRange)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
133 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
134 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
135 return null; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
136 } |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
137 messages.report(UnexpectedTok, peek.location) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
138 .arg(peek.get(sm)) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
139 .arg(Tok.Identifier) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
140 .fatal(ExitLevel.Parser); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
141 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
142 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
143 Extern parseLinkageType() |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
144 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
145 Extern e = Extern.D; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
146 if(peek(1).type != Tok.OpenParentheses) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
147 return e; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
148 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
149 next(); next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
150 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
151 Token t = require(Tok.Identifier); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
152 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
153 switch(sm.getText(t.asRange)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
154 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
155 case "C": |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
156 if (peek(0).type == Tok.Plus && |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
157 peek(1).type == Tok.Plus) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
158 e = Extern.CPlusPlus; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
159 else |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
160 e = Extern.C; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
161 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
162 case "D": |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
163 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
164 case "Windows": |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
165 e = Extern.Windows; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
166 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
167 case "Pascal": |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
168 e = Extern.Pascal; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
169 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
170 case "System": |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
171 e = Extern.System; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
172 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
173 default: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
174 messages.report(UnexpectedLinkType, t.location); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
175 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
176 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
177 if (!isa(Tok.CloseParentheses)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
178 messages.report(UnexpectedTokSingle, peek.location); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
179 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
180 return e; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
181 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
182 |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
183 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
184 Parse a series of imports belonging to a single import token. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
185 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
186 Decl[] parseImports() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
187 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
188 Token _import = require(Tok.Import); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
189 SmallArray!(Decl) res; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
190 void addToRes(Decl d) { res ~= d; } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
191 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
192 bool done = false; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
193 while (!done && !isa(Tok.Seperator)) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
194 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
195 ModuleName mod = parseModuleName(); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
196 Token tok = peek; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
197 switch (tok.type) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
198 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
199 case Tok.Comma: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
200 // import A, B.C; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
201 // parse another module-name |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
202 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
203 res ~= action.actOnImport(_import, mod, null); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
204 break; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
205 case Tok.Assign: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
206 // import B = A.A; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
207 // ^- must be a single identifier |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
208 // renamed import |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
209 if (mod.packages.length != 0) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
210 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
211 SLoc loc = mod.packages[0].tok.location; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
212 messages.report(RenameMustBeSingleIdent, loc); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
213 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
214 //if (isStatic) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
215 // error("Static imports cannot be renamed"); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
216 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
217 Id name = mod.id; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
218 mod = parseModuleName(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
219 // create from mod and rename to `name` |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
220 res ~= action.actOnImport(_import, mod, &name); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
221 break; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
222 case Tok.Colon: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
223 // import A : a; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
224 // selective imports, potentially import A : print = a |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
225 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
226 Decl d = action.actOnImport(_import, mod, null); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
227 // do-while on a comma: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
228 // add explicit symbol |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
229 do |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
230 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
231 Id sym = parseIdentifier(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
232 Id dummy; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
233 Id* name = null; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
234 if (skip(Tok.Assign)) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
235 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
236 dummy = sym; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
237 name = &dummy; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
238 sym = parseIdentifier(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
239 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
240 action.addSelectiveImport(d, sym, name); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
241 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
242 } while (skip(Tok.Comma)); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
243 require(Tok.Seperator); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
244 res ~= d; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
245 return res.safe(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
246 case Tok.Seperator: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
247 done = true; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
248 break; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
249 default: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
250 goto Lerror; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
251 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
252 res ~= action.actOnImport(_import, mod, null); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
253 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
254 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
255 require(Tok.Seperator); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
256 return res.safe(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
257 Lerror: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
258 while (!isa (Tok.Seperator)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
259 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
260 return res.safe(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
261 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
262 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
263 /** |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
264 Parse interface |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
265 */ |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
266 Decl parseInterface(Id type, Id iden, Attribute att) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
267 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
268 auto decl = action.actOnDeclarator(type, iden, null, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
269 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
270 if (peek.type == Tok.Colon) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
271 // SuperInterfaces |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
272 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
273 next(); // Remove colon. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
274 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
275 Id identifier; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
276 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
277 // The identifier |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
278 identifier = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
279 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
280 action.actOnInterfaceBaseClass(decl, identifier); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
281 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
282 // We should now have an optional list of items, each starting ',' |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
283 while (peek.type == Tok.Comma) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
284 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
285 next(); // Remove comma |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
286 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
287 // The identifier |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
288 identifier = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
289 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
290 action.actOnInterfaceBaseClass(decl, identifier); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
291 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
292 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
293 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
294 require(Tok.OpenBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
295 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
296 auto nes = parseAttributeInit; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
297 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
298 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
299 while ( peek.isAttribute ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
300 nes ~= parseAttribute(nes[$-1]); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
301 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
302 auto m_decl = parseDecl(nes[$-1].a); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
303 action.actOnInterfaceMember(decl, m_decl); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
304 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
305 nes = parseAttributeScope(nes); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
306 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
307 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
308 require(Tok.CloseBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
309 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
310 return decl; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
311 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
312 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
313 /** |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
314 Parse class |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
315 */ |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
316 Decl parseClass(Id type, Id iden, Attribute att) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
317 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
318 auto decl = action.actOnDeclarator(type, iden, null, att); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
319 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
320 if (peek.type == Tok.Colon) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
321 // BaseClassList - Super class and interfaces(in that order) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
322 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
323 next(); // Remove colon. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
324 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
325 Token protection; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
326 Id identifier; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
327 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
328 // First we expect an optional protection level. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
329 if (peek.isBaseClassProtection) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
330 protection = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
331 // Then the identifier |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
332 identifier = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
333 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
334 action.actOnClassBaseClass(decl, identifier); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
335 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
336 // We should now have an optional list of items, each starting ',' |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
337 while (peek.type == Tok.Comma) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
338 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
339 next(); // Remove comma |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
340 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
341 // First we expect an optional protection level. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
342 if (peek.isBaseClassProtection) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
343 protection = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
344 // Then the identifier |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
345 identifier = Id(require(Tok.Identifier)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
346 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
347 action.actOnClassBaseClass(decl, identifier); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
348 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
349 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
350 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
351 require(Tok.OpenBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
352 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
353 auto nes = parseAttributeInit; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
354 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
355 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
356 while ( peek.isAttribute ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
357 nes ~= parseAttribute(nes[$-1]); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
358 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
359 switch(peek.type) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
360 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
361 case Tok.This: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
362 auto id = Id(next); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
363 auto m_decl = parseFunc(iden, id, nes[$-1].a); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
364 action.actOnClassMember(decl, m_decl); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
365 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
366 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
367 default: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
368 auto m_decl = parseDecl(nes[$-1].a); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
369 action.actOnClassMember(decl, m_decl); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
370 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
371 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
372 nes = parseAttributeScope(nes); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
373 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
374 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
375 require(Tok.CloseBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
376 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
377 return decl; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
378 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
379 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
380 /** |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
381 Parse struct |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
382 */ |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
383 Decl parseStruct(Id type, Id iden, Attribute att) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
384 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
385 auto decl = action.actOnDeclarator(type, iden, null, att); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
386 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
387 require(Tok.OpenBrace); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
388 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
389 auto nes = parseAttributeInit; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
390 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) ) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
391 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
392 while ( peek.isAttribute ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
393 nes ~= parseAttribute(nes[$-1]); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
394 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
395 auto m_decl = parseDecl(nes[$-1].a); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
396 action.actOnStructMember(decl, m_decl); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
397 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
398 nes = parseAttributeScope(nes); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
399 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
400 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
401 require(Tok.CloseBrace); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
402 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
403 return decl; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
404 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
405 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
406 Att[] parseAttributeInit() |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
407 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
408 Att[] nes; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
409 nes ~= Att(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
410 nes[0].nested = Scope; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
411 return nes; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
412 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
413 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
414 Att[] parseAttributeScope(Att[] nes) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
415 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
416 while ( nes[$-1].nested == Single ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
417 nes.length = nes.length - 1; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
418 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
419 while ( isa(Tok.CloseBrace) && nes.length > 1) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
420 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
421 while ( nes.length > 1 ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
422 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
423 if( nes[$-1].nested == Scope ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
424 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
425 nes.length = nes.length - 1; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
426 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
427 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
428 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
429 nes.length = nes.length - 1; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
430 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
431 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
432 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
433 return nes; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
434 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
435 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
436 Att parseAttribute(Att last) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
437 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
438 Att _parseAttribute(Att last) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
439 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
440 Att a = last; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
441 a.nested = Single; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
442 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
443 switch(peek.type) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
444 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
445 case Tok.Public: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
446 a.a.setProtection(Protection.Public); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
447 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
448 case Tok.Private: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
449 a.a.setProtection(Protection.Private); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
450 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
451 case Tok.Package: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
452 a.a.setProtection(Protection.Package); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
453 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
454 case Tok.Protected: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
455 a.a.setProtection(Protection.Protected); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
456 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
457 case Tok.Export: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
458 a.a.setProtection(Protection.Export); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
459 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
460 case Tok.Static: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
461 a.a.setStatic; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
462 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
463 case Tok.Final: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
464 a.a.setFinal; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
465 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
466 case Tok.Const: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
467 a.a.setConst; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
468 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
469 case Tok.Abstract: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
470 a.a.setAbstract; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
471 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
472 case Tok.Override: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
473 a.a.setOverride; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
474 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
475 case Tok.Deprecated: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
476 a.a.setDeprecated; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
477 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
478 case Tok.Auto: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
479 a.a.setAuto; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
480 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
481 case Tok.Extern: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
482 Extern e = parseLinkageType; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
483 a.a.setExtern(e); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
484 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
485 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
486 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
487 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
488 return a; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
489 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
490 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
491 Att a = _parseAttribute(last); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
492 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
493 while (peek.isAttribute) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
494 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
495 a = parseAttribute(a); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
496 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
497 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
498 if (peek.type == Tok.Colon) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
499 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
500 a.nested = All; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
501 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
502 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
503 else if (peek.type == Tok.OpenBrace) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
504 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
505 a.nested = Scope; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
506 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
507 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
508 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
509 return a; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
510 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
511 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
512 enum : uint |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
513 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
514 Single, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
515 Scope, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
516 All |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
517 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
518 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
519 struct Att |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
520 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
521 Attribute a; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
522 uint nested; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
523 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
524 |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
525 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
526 Parse statements. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
527 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
528 This is the place to attack! |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
529 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
530 Stmt parseStatement() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
531 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
532 switch (peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
533 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
534 case Tok.Return: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
535 Token ret = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
536 Exp exp; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
537 if (peek.type != Tok.Seperator) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
538 exp = parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
539 require(Tok.Seperator); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
540 return action.actOnReturnStmt(ret, exp); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
541 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
542 case Tok.If: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
543 Token _if = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
544 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
545 require(Tok.OpenParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
546 Exp cond = parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
547 require(Tok.CloseParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
548 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
549 Stmt thenB = parseSingleOrCompoundStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
550 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
551 // if there is no else part we use the if as token, to have |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
552 // something than can be passed along |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
553 Token _else = _if; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
554 Stmt elseB; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
555 if (peek.type == Tok.Else) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
556 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
557 _else = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
558 elseB = parseSingleOrCompoundStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
559 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
560 return action.actOnIfStmt(_if, cond, thenB, _else, elseB); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
561 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
562 case Tok.While: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
563 Token _while = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
564 require(Tok.OpenParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
565 Exp cond = parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
566 require(Tok.CloseParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
567 Stmt bodyStmt = parseSingleOrCompoundStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
568 return action.actOnWhileStmt(_while, cond, bodyStmt); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
569 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
570 case Tok.For: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
571 Token _for = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
572 require(Tok.OpenParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
573 Stmt init; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
574 if ( isa(Tok.Seperator)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
575 require(Tok.Seperator); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
576 else |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
577 init = parseStatement(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
578 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
579 Exp cond; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
580 if ( !isa(Tok.Seperator)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
581 cond = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
582 require(Tok.Seperator); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
583 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
584 Exp incre; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
585 if ( !isa(Tok.CloseParentheses)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
586 incre = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
587 require(Tok.CloseParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
588 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
589 Stmt bodyStmt = parseSingleOrCompoundStatement(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
590 return action.actOnForStmt(_for, init, cond, incre, bodyStmt); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
591 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
592 case Tok.Switch: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
593 auto t = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
594 require(Tok.OpenParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
595 auto target = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
596 auto res = action.actOnStartOfSwitchStmt(t, target); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
597 require(Tok.CloseParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
598 require(Tok.OpenBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
599 while (true) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
600 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
601 Stmt[] statements; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
602 if (isa(Tok.Default)) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
603 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
604 Token _default = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
605 require(Tok.Colon); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
606 statements.length = 0; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
607 while (peek.type != Tok.Case |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
608 && peek.type != Tok.Default |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
609 && peek.type != Tok.CloseBrace) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
610 statements ~= parseStatement(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
611 action.actOnDefaultStmt(res, _default, statements); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
612 continue; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
613 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
614 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
615 Token _case = peek; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
616 if (_case.type != Tok.Case) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
617 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
618 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
619 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
620 Exp[] literals; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
621 do |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
622 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
623 Exp e = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
624 literals ~= e; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
625 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
626 while (skip(Tok.Comma)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
627 require(Tok.Colon); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
628 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
629 while (peek.type != Tok.Case |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
630 && peek.type != Tok.Default |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
631 && peek.type != Tok.CloseBrace) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
632 statements ~= parseStatement(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
633 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
634 action.actOnCaseStmt(res, _case, literals, statements); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
635 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
636 if (peek.type == Tok.CloseBrace) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
637 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
638 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
639 require(Tok.CloseBrace); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
640 return res; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
641 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
642 case Tok.Star: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
643 auto exp = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
644 require(Tok.Seperator); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
645 return action.actOnExprStmt(exp); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
646 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
647 case Tok.Identifier: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
648 // If it's a '*' it must be a method. Otherwise it won't give |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
649 // any sense. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
650 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
651 if (isa(Tok.Function, 1) || |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
652 isa(Tok.Identifier, 1) || |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
653 isa(Tok.Star, 1)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
654 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
655 Attribute a; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
656 return action.actOnDeclStmt(parseDecl(a)); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
657 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
658 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
659 if (isa(Tok.OpenBracket, 1)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
660 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
661 int i = 1; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
662 while (isa(Tok.OpenBracket, i) || |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
663 isa(Tok.Star, i) || |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
664 isa(Tok.Identifier, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
665 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
666 if (isa(Tok.Identifier, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
667 return action.actOnDeclStmt(parseDecl(Attribute())); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
668 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
669 i++; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
670 if (isa(Tok.Star,i-1)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
671 continue; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
672 // Must be OpenBracket here.. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
673 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
674 if (isa(Tok.Integer, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
675 i++; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
676 else |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
677 if (isa(Tok.CloseBracket, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
678 return action.actOnDeclStmt(parseDecl(Attribute())); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
679 else |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
680 i++; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
681 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
682 if (!isa(Tok.CloseBracket, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
683 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
684 i++; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
685 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
686 if (isa(Tok.Function, i)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
687 return action.actOnDeclStmt(parseDecl(Attribute())); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
688 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
689 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
690 // Expression: a.b, a = b, a(b) etc. |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
691 Exp exp = parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
692 require(Tok.Seperator); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
693 return action.actOnExprStmt(exp); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
694 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
695 case Tok.Void: // And all basic types |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
696 return action.actOnDeclStmt(parseVarDecl()); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
697 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
698 default: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
699 if (peek.isBasicType) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
700 goto case Tok.Void; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
701 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
702 messages.report(UnexpectedBeginStmt, peek.location).arg(peek.get(sm)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
703 require(Tok.Seperator); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
704 return null; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
705 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
706 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
707 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
708 Decl parseVarDecl() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
709 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
710 // manually hardcoded to only support "type id [= exp];" |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
711 // as that is the only thing the codegen understands |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
712 Id type = parseType(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
713 Id id = Id(next()); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
714 Exp init; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
715 if (skip(Tok.Assign)) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
716 init = parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
717 require(Tok.Seperator); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
718 Attribute att; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
719 Decl d = action.actOnDeclarator(type, id, init, att); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
720 return d; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
721 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
722 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
723 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
724 Parses a function/method given the already parsed return type and name |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
725 */ |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
726 Decl parseFunc(ref Id type, ref Id name, Attribute att) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
727 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
728 Decl func = action.actOnStartOfFunctionDef(type, name, att); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
729 parseFuncArgs(func); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
730 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
731 if(peek.type == Tok.Seperator) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
732 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
733 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
734 return func; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
735 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
736 Stmt stmt = parseCompoundStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
737 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
738 return action.actOnEndOfFunction(func, stmt); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
739 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
740 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
741 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
742 Parse the function arguments, assumes current token is (. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
743 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
744 Both the intitial paren and the ending paren is consumed. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
745 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
746 void parseFuncArgs(Decl func) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
747 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
748 require(Tok.OpenParentheses); // Remove the "(" token. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
749 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
750 while(peek.type != Tok.CloseParentheses) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
751 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
752 auto t = parseType(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
753 Id i; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
754 if(peek.type == Tok.Identifier) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
755 i = parseIdentifier(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
756 action.addFuncArg(func, t, i); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
757 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
758 if(peek.type == Tok.Comma) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
759 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
760 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
761 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
762 require(Tok.CloseParentheses); // Remove the ")" |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
763 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
764 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
765 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
766 Parse either a block, or a single statement as allowed after if, while |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
767 and for. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
768 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
769 Stmt parseSingleOrCompoundStatement() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
770 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
771 if (peek.type == Tok.OpenBrace) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
772 return parseCompoundStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
773 return parseStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
774 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
775 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
776 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
777 Parses a function-body or similar, expects an opening brace to be the |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
778 current token. |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
779 |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
780 Will consume both the starting { and ending } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
781 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
782 Stmt parseCompoundStatement() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
783 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
784 Token lbrace = require(Tok.OpenBrace); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
785 SmallArray!(Stmt, 32) stmts; // Try to use the stack only |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
786 while ( !isa(Tok.CloseBrace) && !isa(Tok.EOF) ) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
787 stmts ~= parseStatement(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
788 Token rbrace = require(Tok.CloseBrace); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
789 return action.actOnCompoundStmt(lbrace, rbrace, stmts.unsafe()); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
790 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
791 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
792 Id parseIdentifier() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
793 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
794 Token tok = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
795 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
796 if (tok.type is Tok.Identifier) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
797 return Id(tok); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
798 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
799 messages.report(UnexpectedTokSingle, tok.location) |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
800 .arg(tok.get(sm)) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
801 .arg(Tok.Identifier); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
802 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
803 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
804 ModuleName parseModuleName() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
805 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
806 auto id = parseIdentifier(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
807 ModuleName mod; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
808 while (skip(Tok.Dot)) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
809 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
810 mod.packages ~= id; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
811 if (peek.type != Tok.Identifier) { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
812 messages.report(ExpectedIdAfterPackage, peek.location); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
813 goto Lerror; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
814 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
815 id = parseIdentifier(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
816 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
817 mod.id = id; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
818 return mod; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
819 Lerror: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
820 while (!skip(Tok.Seperator)) |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
821 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
822 return mod; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
823 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
824 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
825 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
826 /** |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
827 Parse a type - this includes pointer and array(at some point) types. |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
828 */ |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
829 Id parseType() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
830 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
831 Token type = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
832 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
833 Id currentType; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
834 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
835 if ( !(type.isBasicType || type.type == Tok.Identifier) ) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
836 messages.report(InvalidType, type.location); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
837 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
838 currentType = Id(type); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
839 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
840 while(true) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
841 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
842 switch(peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
843 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
844 case Tok.Star: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
845 currentType = PointerTypeId(currentType); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
846 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
847 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
848 case Tok.OpenBracket: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
849 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
850 if (isa(Tok.Integer)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
851 currentType = StaticArrayTypeId( |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
852 currentType, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
853 action.actOnNumericConstant( |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
854 require(Tok.Integer))); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
855 require(Tok.CloseBracket); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
856 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
857 case Tok.Function: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
858 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
859 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
860 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
861 require(Tok.OpenParentheses); // Remove the "(" token. |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
862 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
863 DeclT[] decls; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
864 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
865 while(peek.type != Tok.CloseParentheses) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
866 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
867 auto t = parseType(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
868 Id i; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
869 if(peek.type == Tok.Identifier) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
870 i = parseIdentifier(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
871 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
872 // Act on function type param |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
873 decls ~= action.actOnDeclarator(t, i, null, Attribute()); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
874 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
875 if(peek.type == Tok.Comma) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
876 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
877 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
878 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
879 currentType = FunctionTypeId(currentType, decls); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
880 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
881 require(Tok.CloseParentheses); // Remove the ")" |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
882 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
883 default: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
884 goto end; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
885 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
886 } |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
887 end: |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
888 return currentType; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
889 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
890 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
891 private: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
892 // -- Expression parsing -- // |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
893 Exp parsePostfixExp(Exp target) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
894 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
895 switch(peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
896 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
897 case Tok.Dot: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
898 switch(peek(1).type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
899 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
900 case Tok.Identifier: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
901 Token op = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
902 Id member = Id(next()); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
903 Exp exp = action.actOnMemberReference(target, op.location, member); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
904 return parsePostfixExp(exp); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
905 default: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
906 Token t = peek(1); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
907 messages.report(ExpectedIdAfterDot, t.location); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
908 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
909 case Tok.OpenBracket: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
910 Token open = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
911 Exp index = parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
912 Token close = require(Tok.CloseBracket); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
913 return action.actOnIndexExpr(target, open, index, close); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
914 default: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
915 return target; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
916 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
917 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
918 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
919 Exp parseExpression(int p = 0) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
920 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
921 auto exp = P(); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
922 Token n = peek(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
923 BinOp* op = null; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
924 while ((op = binary(n.type)) != null && op.prec >= p) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
925 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
926 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
927 int q = op.leftAssoc? 1 + op.prec : op.prec; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
928 auto exp2 = parseExpression(q); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
929 exp = action.actOnBinaryOp(n.location, op.operator, exp, exp2); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
930 n = peek(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
931 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
932 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
933 return exp; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
934 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
935 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
936 Exp P() |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
937 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
938 Token n = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
939 if (auto op = unary(n.type)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
940 return action.actOnUnaryOp(n, parseExpression(op.prec)); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
941 else if (n.type == Tok.OpenParentheses) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
942 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
943 auto e = parseExpression(0); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
944 require(Tok.CloseParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
945 return e; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
946 } |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
947 else if (n.type == Tok.Identifier) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
948 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
949 Exp value = action.actOnIdentifierExp(Id(n)); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
950 Exp iden = parsePostfixExp(value); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
951 switch(peek.type) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
952 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
953 case Tok.OpenParentheses: |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
954 Token lp = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
955 SmallArray!(Exp, 8) args; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
956 while(peek.type != Tok.CloseParentheses) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
957 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
958 if(peek.type == Tok.Comma) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
959 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
960 args ~= parseExpression(); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
961 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
962 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
963 Token rp = next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
964 return action.actOnCallExpr(iden, lp, args.unsafe(), rp); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
965 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
966 default: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
967 return iden; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
968 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
969 } |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
970 else if (n.type == Tok.Null) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
971 return action.actOnNullExpr(n.location); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
972 else if (n.type == Tok.Cast) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
973 return parseCast(n); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
974 else if (n.type == Tok.Integer) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
975 return action.actOnNumericConstant(n); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
976 else if (n.type == Tok.String) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
977 return action.actOnStringExp(n); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
978 else if (n.type == Tok.OpenBracket) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
979 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
980 // Array literals |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
981 Exp[] exps; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
982 exps ~= parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
983 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
984 while (isa(Tok.Comma)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
985 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
986 next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
987 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
988 if (isa(Tok.CloseBracket)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
989 break; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
990 exps ~= parseExpression(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
991 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
992 scope e = require(Tok.CloseBracket); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
993 return action.actOnArrayLiteralExpr(exps, n.location, e.location); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
994 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
995 else if (n.type == Tok.New) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
996 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
997 Exp[] allocator_args; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
998 Exp[] constructor_args; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
999 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1000 if ( isa(Tok.OpenParentheses)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1001 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1002 next(); // Remove OpenParentheses |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1003 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1004 if ( !isa(Tok.CloseParentheses ) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1005 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1006 allocator_args ~= parseExpression; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1007 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1008 while ( isa(Tok.Comma) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1009 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1010 next(); // Remove Comma |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1011 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1012 allocator_args ~= parseExpression; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1013 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1014 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1015 require(Tok.CloseParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1016 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1017 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1018 auto type = parseType; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1019 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1020 if ( isa(Tok.OpenParentheses)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1021 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1022 next(); // Remove OpenParentheses |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1023 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1024 if ( !isa(Tok.CloseParentheses ) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1025 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1026 constructor_args ~= parseExpression; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1027 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1028 while ( isa(Tok.Comma) ) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1029 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1030 next(); // Remove Comma |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1031 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1032 constructor_args ~= parseExpression; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1033 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1034 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1035 require(Tok.CloseParentheses); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1036 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1037 return action.actOnNewExpr(type, allocator_args, constructor_args); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1038 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1039 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1040 messages.report(ExpectedExp, n.location) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1041 .fatal(ExitLevel.Parser); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1042 return null; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1043 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1044 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1045 Exp parseCast(ref Token _cast) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1046 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1047 require(Tok.OpenParentheses); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1048 auto n = next(); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1049 if(!n.isBasicType && !n.isIdentifier) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1050 messages.report(ExpectedCastType, n.location); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1051 |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1052 require(Tok.CloseParentheses); |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1053 auto exp = P(); |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1054 return action.actOnCastExpr(_cast, Id(n), exp); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1055 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1056 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1057 struct UnOp |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1058 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1059 Tok tokenType; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1060 int prec; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1061 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1062 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1063 static const UnOp[] _unary = |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1064 [ |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1065 {Tok.Minus, 4}, |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1066 {Tok.Star, 4}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1067 {Tok.And, 4} |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1068 ]; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1069 UnOp* unary(Tok t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1070 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1071 foreach (ref op; _unary) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1072 if (op.tokenType == t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1073 return &op; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1074 return null; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1075 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1076 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1077 struct BinOp |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1078 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1079 Tok tokenType; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1080 int prec; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1081 bool leftAssoc; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1082 Operator operator; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1083 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1084 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1085 static const BinOp[] _binary = |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1086 [ |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1087 {Tok.Assign, 1, false, Operator.Assign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1088 {Tok.PlusAssign, 1, false, Operator.AddAssign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1089 {Tok.MinusAssign, 1, false, Operator.SubAssign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1090 {Tok.StarAssign, 1, false, Operator.MulAssign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1091 {Tok.SlashAssign, 1, false, Operator.DivAssign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1092 {Tok.PercentAssign, 1, false, Operator.ModAssign}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1093 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1094 // =, += etc. 1 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1095 // (need special-case for the ternary operator at this level) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1096 // ||, 2 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1097 // &&, 3 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1098 // |, 4 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1099 // &, 5 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1100 // ^, 6 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1101 // ==, !=, is, !is, 7 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1102 // <, <= etc, 7 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1103 // in, 7 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1104 // <<, >>, >>>, 8 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1105 // +, -, ~, 9 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1106 // *, /, %, 10 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1107 // unary operators here |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1108 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1109 {Tok.Eq, 2, true, Operator.Eq}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1110 {Tok.Ne, 2, true, Operator.Ne}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1111 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1112 {Tok.Lt, 2, true, Operator.Lt}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1113 {Tok.Le, 2, true, Operator.Le}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1114 {Tok.Gt, 2, true, Operator.Gt}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1115 {Tok.Ge, 2, true, Operator.Ge}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1116 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1117 {Tok.Plus, 3, true, Operator.Add}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1118 {Tok.Minus, 3, true, Operator.Sub}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1119 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1120 {Tok.Star, 5, true, Operator.Mul}, |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1121 {Tok.Slash, 5, true, Operator.Div}, |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1122 {Tok.Percent, 5, true, Operator.Mod}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1123 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1124 {Tok.LeftShift, 8, true, Operator.LeftShift}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1125 {Tok.RightShift, 8, true, Operator.RightShift}, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1126 {Tok.UnsignedRightShift, 8, true, Operator.UnsignedRightShift} |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1127 ]; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1128 BinOp* binary(Tok t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1129 { |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1130 foreach (ref op; _binary) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1131 if (op.tokenType == t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1132 return &op; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1133 return null; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1134 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1135 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1136 private: |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1137 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1138 Token require(Tok t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1139 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1140 if (!isa(t)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1141 if(isa(Tok.EOF)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1142 messages.report(UnexpectedEOF, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1143 [lexer.last.asRange][], []) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1144 .arg(lexer.last.get(sm)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1145 .fatal(ExitLevel.Parser); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1146 else |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1147 messages.report(UnexpectedTokSingle, peek.location) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1148 .arg(peek.get(sm)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1149 .arg(typeToString[t]); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1150 return next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1151 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1152 |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1153 bool skip(Tok t) |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1154 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1155 if (peek().type != t) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1156 return false; |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1157 next(); |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1158 return true; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1159 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1160 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1161 bool isa(Tok t, int i = 0) |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1162 { |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1163 return peek(i).type == t; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1164 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1165 |
207
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1166 bool isEOF(Token t) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1167 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1168 if (isa(Tok.EOF)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1169 messages.report(UnexpectedEOF, |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1170 [t.asRange][], []) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1171 .arg(t.get(sm)) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1172 .fatal(ExitLevel.Parser); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1173 return false; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1174 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1175 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1176 Token next() |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1177 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1178 return lexer.next; |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1179 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1180 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1181 Token peek(int i = 0) |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1182 { |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1183 return lexer.peek(i); |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1184 } |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1185 |
e0551773a005
Added the correct version.
Anders Johnsen <skabet@gmail.com>
parents:
206
diff
changeset
|
1186 Lexer lexer; |
206
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1187 SourceManager sm; |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1188 } |
d3c148ca429b
Major moving of files. all src now goes into src, all docs in docs.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1189 |