annotate dmd/Parser.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents af1bebfd96a4
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Parser;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Lexer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.PostBlitDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.FileInitExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.LineInitExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.EnumMember;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.CtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.ShlAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.ShrAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.UshrAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.CatAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.StaticIfCondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.TraitsExp;
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
16 import dmd.TemplateMixin;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.BaseClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.AssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.NewExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.ArrayExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.DotTemplateInstanceExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.NewAnonClassExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.InterfaceDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.StructDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.UnionDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.AnonDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.StructInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.ArrayInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.ExpInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.TemplateAliasParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.TemplateTupleParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.TemplateThisParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.TemplateValueParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.VoidInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.VersionCondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.DebugCondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.PostExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.CallExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.SliceExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.FuncExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.AssocArrayLiteralExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.ArrayLiteralExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.IsExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.FuncLiteralDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.AssertExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.CompileExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.FileExp;
19
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
51 import dmd.TemplateMixin;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.TemplateParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.TemplateTypeParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.TypeidExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.StringExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 import dmd.ScopeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 import dmd.IdentifierExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 import dmd.DollarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 import dmd.ThisExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 import dmd.SuperExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 import dmd.NullExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 import dmd.RealExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 import dmd.TypeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 import dmd.AddrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 import dmd.MOD;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 import dmd.CastExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 import dmd.PtrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 import dmd.NegExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 import dmd.XorAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 import dmd.OrAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 import dmd.UAddExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 import dmd.NotExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 import dmd.ComExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 import dmd.DeleteExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 import dmd.MulAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 import dmd.ModAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 import dmd.MinAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 import dmd.DivAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 import dmd.AndAssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 import dmd.AddAssignExp;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
82 import dmd.PowAssignExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 import dmd.ModuleDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 import dmd.CaseRangeStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 import dmd.CommaExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 import dmd.XorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 import dmd.CondExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 import dmd.CmpExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 import dmd.InExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 import dmd.OrOrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 import dmd.OrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 import dmd.AddExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 import dmd.MinExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 import dmd.CatExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 import dmd.AndAndExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 import dmd.EqualExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 import dmd.ShlExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 import dmd.ShrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 import dmd.DivExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 import dmd.MulExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 import dmd.ModExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 import dmd.UshrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 import dmd.IdentityExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 import dmd.AndExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 import dmd.LabelStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 import dmd.ExpStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 import dmd.StaticAssertStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 import dmd.DeclarationStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 import dmd.ScopeStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 import dmd.PragmaStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 import dmd.WhileStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 import dmd.DoStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 import dmd.ForStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 import dmd.OnScopeStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 import dmd.IfStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 import dmd.SwitchStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 import dmd.CaseStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 import dmd.DefaultStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 import dmd.GotoDefaultStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 import dmd.GotoCaseStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 import dmd.GotoStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 import dmd.SynchronizedStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 import dmd.WithStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 import dmd.Catch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 import dmd.TryCatchStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 import dmd.TryFinallyStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 import dmd.ThrowStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 import dmd.VolatileStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 import dmd.ReturnStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 import dmd.BreakStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 import dmd.ContinueStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 import dmd.AsmStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 import dmd.TypeReturn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 import dmd.TypeTypeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 import dmd.ForeachRangeStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 import dmd.ForeachStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 import dmd.CompileStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 import dmd.CompoundStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 import dmd.ConditionalStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 import dmd.CompoundDeclarationStatement;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
142 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 import dmd.ParseStatementFlags;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
144 import dmd.TypeNewArray;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 import dmd.TypeNext;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 import dmd.TypeInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 import dmd.TypePointer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 import dmd.TypeDArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 import dmd.TypeAArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 import dmd.TypeSlice;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 import dmd.TypeIdentifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 import dmd.TypeFunction;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 import dmd.TypeDelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 import dmd.LinkDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 import dmd.Declaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 import dmd.TypedefDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 import dmd.AliasDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 import dmd.LINK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 import dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 import dmd.TemplateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 import dmd.StaticAssert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 import dmd.TypeQualified;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 import dmd.Condition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 import dmd.PostBlitDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 import dmd.DtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 import dmd.ConditionalDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 import dmd.StaticCtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 import dmd.StaticDtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 import dmd.InvariantDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 import dmd.UnitTestDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 import dmd.NewDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 import dmd.DeleteDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 import dmd.EnumDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 import dmd.Import;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 import dmd.Statement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 import dmd.Initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 import dmd.Token;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 import dmd.ParseStatementFlags;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 import dmd.PROT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 import dmd.CompileDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 import dmd.StaticIfDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 import dmd.StorageClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 import dmd.LinkDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 import dmd.ProtDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 import dmd.AlignDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 import dmd.PragmaDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 import dmd.DebugSymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 import dmd.VersionSymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 import dmd.AliasThis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 import dmd.Global;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
207 import dmd.TRUST;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
208 import dmd.PowExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 import core.stdc.string : memcpy;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211
34
544b922227c7 update to work with dmd 2.048
korDen
parents: 24
diff changeset
212 import std.exception;
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
213 import core.memory;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 class Parser : Lexer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 ModuleDeclaration md;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 LINK linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 Loc endloc; // set to location of last right curly
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 int inBrackets; // inside [] of array index or slice
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 this(Module module_, ubyte* base, uint length, int doDocComment)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
224 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 super(module_, base, 0, length, doDocComment, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 //printf("Parser.Parser()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 linkage = LINK.LINKd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 //nextToken(); // start up the scanner
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
231 Dsymbols parseModule()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
233 typeof(return) decldefs;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 // ModuleDeclation leads off
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 if (token.value == TOK.TOKmodule)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
238 string comment = token.blockComment;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 bool safe = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 nextToken();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
242 static if(false) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 error("module (system) identifier expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 Identifier id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 if (id is Id.system)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 safe = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 error("(safe) expected, not %s", id.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
262 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 error("Identifier expected following module");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
271 Identifiers a = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 Identifier id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 while (nextToken() == TOK.TOKdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 if (!a)
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
276 a = new Identifiers();
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
277 a.push(id);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 { error("Identifier expected following package");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 md = new ModuleDeclaration(a, id, safe);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 if (token.value != TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 error("';' expected following module declaration instead of %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 addComment(mod, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 decldefs = parseDeclDefs(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 if (token.value != TOK.TOKeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 error("unrecognized declaration");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 return decldefs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 Lerr:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 while (token.value != TOK.TOKsemicolon && token.value != TOK.TOKeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 nextToken();
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
310 return new Dsymbols();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
313 Dsymbols parseDeclDefs(int once)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 Dsymbol s;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
316 Dsymbols decldefs;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
317 Dsymbols a;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
318 Dsymbols aelse;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 PROT prot;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
320 StorageClass stc;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
321 StorageClass storageClass;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 Condition condition;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
323 string comment;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 //printf("Parser.parseDeclDefs()\n");
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
326 decldefs = new Dsymbols();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 do
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 comment = token.blockComment;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 storageClass = STC.STCundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 case TOK.TOKenum:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 { /* Determine if this is a manifest constant declaration,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 * or a conventional enum.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 Token *t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 if (t.value == TOK.TOKlcurly || t.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 s = parseEnum();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 else if (t.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 if (t.value == TOK.TOKlcurly || t.value == TOK.TOKcolon ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 t.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 s = parseEnum();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 case TOK.TOKstruct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 case TOK.TOKunion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 case TOK.TOKclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 case TOK.TOKinterface:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 s = parseAggregate();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 case TOK.TOKimport:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 s = parseImport(decldefs, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 case TOK.TOKtemplate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 s = cast(Dsymbol)parseTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 case TOK.TOKmixin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 { Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 { // mixin(string)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 check(TOK.TOKlparen, "mixin");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 Expression e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 check(TOK.TOKsemicolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 s = new CompileDeclaration(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 s = parseMixin();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 case TOK.TOKwchar: case TOK.TOKdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 case TOK.TOKbit: case TOK.TOKbool: case TOK.TOKchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 case TOK.TOKint8: case TOK.TOKuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 case TOK.TOKint16: case TOK.TOKuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 case TOK.TOKint32: case TOK.TOKuns32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 case TOK.TOKint64: case TOK.TOKuns64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 case TOK.TOKfloat32: case TOK.TOKfloat64: case TOK.TOKfloat80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 case TOK.TOKimaginary32: case TOK.TOKimaginary64: case TOK.TOKimaginary80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 case TOK.TOKcomplex32: case TOK.TOKcomplex64: case TOK.TOKcomplex80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 case TOK.TOKvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 case TOK.TOKalias:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 case TOK.TOKtypedef:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 Ldeclaration:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 a = parseDeclarations(STC.STCundefined);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 decldefs.append(a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 case TOK.TOKthis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 s = parseCtor();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 static if (false) { // dead end, use this(this){} instead
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 case TOK.TOKassign:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 s = parsePostBlit();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 case TOK.TOKtilde:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 s = parseDtor();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 { Token *t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 if (t.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 if (peek(t).value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 // invariant() forms start of class invariant
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 s = parseInvariant();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 // invariant(type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 stc = STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 case TOK.TOKunittest:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 s = parseUnitTest();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 case TOK.TOKnew:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 s = parseNew();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 case TOK.TOKdelete:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 s = parseDelete();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 case TOK.TOKrcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 return decldefs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 case TOK.TOKstatic:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 if (token.value == TOK.TOKthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 s = parseStaticCtor();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 else if (token.value == TOK.TOKtilde)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 s = parseStaticDtor();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 else if (token.value == TOK.TOKassert)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 s = parseStaticAssert();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 else if (token.value == TOK.TOKif)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 { condition = parseStaticIfCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 aelse = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 if (token.value == TOK.TOKelse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 aelse = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 s = new StaticIfDeclaration(condition, a, aelse);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 else if (token.value == TOK.TOKimport)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 s = parseImport(decldefs, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 { stc = STC.STCstatic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 goto Lstc2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 stc = STC.STCconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 stc = STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 case TOK.TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 stc = STC.STCshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
501 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
502 if (peek(&token).value == TOK.TOKlparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
503 goto Ldeclaration;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
504 stc = STCwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
505 goto Lstc;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
506
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 case TOK.TOKfinal: stc = STC.STCfinal; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 case TOK.TOKauto: stc = STC.STCauto; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 case TOK.TOKscope: stc = STC.STCscope; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 case TOK.TOKoverride: stc = STC.STCoverride; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 case TOK.TOKabstract: stc = STC.STCabstract; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 case TOK.TOKsynchronized: stc = STC.STCsynchronized; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 case TOK.TOKdeprecated: stc = STC.STCdeprecated; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 case TOK.TOKnothrow: stc = STC.STCnothrow; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 case TOK.TOKpure: stc = STC.STCpure; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 case TOK.TOKref: stc = STC.STCref; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 case TOK.TOKtls: stc = STC.STCtls; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 case TOK.TOKgshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 stc = STC.STCgshared; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 //case TOK.TOKmanifest: stc = STC.STCmanifest; goto Lstc;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
522 case TOK.TOKat: stc = parseAttribute(); goto Lstc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 Lstc:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 if (storageClass & stc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 error("redundant storage class %s", Token.toChars(token.value));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 composeStorageClass(storageClass | stc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 Lstc2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 storageClass |= stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 case TOK.TOKshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
538 case TOKwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 // If followed by a (, it is not a storage class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 if (token.value == TOK.TOKconst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 stc = STC.STCconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 else if (token.value == TOK.TOKshared)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 stc = STC.STCshared;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
546 else if (token.value == TOKwild)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
547 stc = STC.STCwild;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 stc = STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 case TOK.TOKfinal: stc = STC.STCfinal; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 case TOK.TOKauto: stc = STC.STCauto; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 case TOK.TOKscope: stc = STC.STCscope; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 case TOK.TOKoverride: stc = STC.STCoverride; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 case TOK.TOKabstract: stc = STC.STCabstract; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 case TOK.TOKsynchronized: stc = STC.STCsynchronized; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 case TOK.TOKdeprecated: stc = STC.STCdeprecated; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 case TOK.TOKnothrow: stc = STC.STCnothrow; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559 case TOK.TOKpure: stc = STC.STCpure; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 case TOK.TOKref: stc = STC.STCref; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561 case TOK.TOKtls: stc = STC.STCtls; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 case TOK.TOKgshared: stc = STC.STCgshared; goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 //case TOK.TOKmanifest: stc = STC.STCmanifest; goto Lstc;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
564 case TOK.TOKat: stc = parseAttribute(); goto Lstc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 /* Look for auto initializers:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 * storage_class identifier = initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 if (token.value == TOK.TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 peek(&token).value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 a = parseAutoDeclarations(storageClass, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 decldefs.append(a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 /* Look for return type inference for template functions.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 Token *tk;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 if (token.value == TOK.TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 (tk = peek(&token)).value == TOK.TOKlparen &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 skipParens(tk, &tk) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 (peek(tk).value == TOK.TOKlparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 peek(tk).value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 a = parseDeclarations(storageClass);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 decldefs.append(a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 s = new StorageClassDeclaration(storageClass, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 case TOK.TOKextern:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 if (peek(&token).value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 stc = STC.STCextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 goto Lstc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 LINK linksave = linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 linkage = parseLinkage();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 s = new LinkDeclaration(linkage, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 linkage = linksave;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 case TOK.TOKprivate: prot = PROT.PROTprivate; goto Lprot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 case TOK.TOKpackage: prot = PROT.PROTpackage; goto Lprot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 case TOK.TOKprotected: prot = PROT.PROTprotected; goto Lprot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 case TOK.TOKpublic: prot = PROT.PROTpublic; goto Lprot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 case TOK.TOKexport: prot = PROT.PROTexport; goto Lprot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 Lprot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 case TOK.TOKprivate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 case TOK.TOKpackage:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 case TOK.TOKprotected:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 case TOK.TOKpublic:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 case TOK.TOKexport:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 error("redundant protection attribute");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 s = new ProtDeclaration(prot, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 case TOK.TOKalign:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 { uint n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 if (token.value == TOK.TOKint32v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 n = cast(uint)token.uns64value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 { error("integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 n = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 n = global.structalign; // default
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 s = new AlignDeclaration(n, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 case TOK.TOKpragma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 { Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 Expressions args = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 { error("pragma(identifier expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 if (token.value == TOK.TOKcomma && peekNext() != TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 args = parseArguments(); // pragma(identifier, args...)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 check(TOK.TOKrparen); // pragma(identifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 a = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 s = new PragmaDeclaration(loc, ident, args, a);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 case TOK.TOKdebug:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 s = new DebugSymbol(loc, token.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 else if (token.value == TOK.TOKint32v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 s = new DebugSymbol(loc, cast(uint)token.uns64value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696 { error("identifier or integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 if (token.value != TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 error("semicolon expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
702 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
704 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
705
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
706 condition = parseDebugCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
707 goto Lcondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
708
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
709 case TOK.TOKversion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
710 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
711 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
712 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
713 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
714 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715 s = new VersionSymbol(loc, token.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716 else if (token.value == TOK.TOKint32v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 s = new VersionSymbol(loc, cast(uint)token.uns64value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
718 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
719 { error("identifier or integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
720 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
723 if (token.value != TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724 error("semicolon expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
725 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
726 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
728 condition = parseVersionCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 goto Lcondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
730
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
731 Lcondition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
732 a = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
733 aelse = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
734 if (token.value == TOK.TOKelse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
735 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
736 aelse = parseBlock();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
737 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738 s = new ConditionalDeclaration(condition, a, aelse);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
739 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 case TOK.TOKsemicolon: // empty declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 error("Declaration expected, not '%s'",token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747 Lerror:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 while (token.value != TOK.TOKsemicolon && token.value != TOK.TOKeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 if (s)
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
755 { decldefs.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 addComment(s, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 } while (!once);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759 return decldefs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
761
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
762 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763 * Parse auto declarations of the form:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
764 * storageClass ident = init, ident = init, ... ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
765 * and return the array of them.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
766 * Starts with token on the first ident.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
767 * Ends with scanner past closing ';'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
768 */
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
769 version (DMDV2)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
770 {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
771 Dsymbols parseAutoDeclarations(StorageClass storageClass, const(char)[] comment)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
773 auto a = new Dsymbols;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
774
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 while (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
777 Identifier ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
778 nextToken(); // skip over ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
779 assert(token.value == TOKassign);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780 nextToken(); // skip over '='
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781 Initializer init = parseInitializer();
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
782 auto v = new VarDeclaration(loc, null, ident, init);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
783 v.storage_class = storageClass;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
784 a.push(v);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
785 if (token.value == TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
790 else if (token.value == TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 if (token.value == TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 peek(&token).value == TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
796 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800 error("Identifier expected following comma");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 error("semicolon expected following auto declaration, not '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 /********************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 * Parse declarations after an align, protection, or extern decl.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 */
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
812 Dsymbols parseBlock()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
814 Dsymbols a = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 Dsymbol ss;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 //printf("parseBlock()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
819 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 error("declaration expected following attribute, not ';'");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 error("declaration expected following attribute, not EOF");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 a = parseDeclDefs(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 if (token.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833 { /* { */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 error("matching '}' expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 case TOK.TOKcolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
841 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843 a = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
844 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
845 a = parseDeclDefs(0); // grab declarations up to closing curly bracket
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
846 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
850 a = parseDeclDefs(1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
851 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
852 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
855 version(DMDV2) {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
856 void composeStorageClass(StorageClass stc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
857 {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
858 StorageClass u = stc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
859 u &= STC.STCconst | STC.STCimmutable | STC.STCmanifest;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860 if (u & (u - 1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
861 error("conflicting storage class %s", Token.toChars(token.value));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
862
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
863 u = stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864 u &= STC.STCgshared | STC.STCshared | STC.STCtls;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865 if (u & (u - 1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
866 error("conflicting storage class %s", Token.toChars(token.value));
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
867 u = stc;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
868 u &= STCsafe | STCsystem | STCtrusted;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
869 if (u & (u - 1))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
870 error("conflicting attribute @%s", token.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
872 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
873
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
874 /***********************************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
875 * Parse storage class, lexer is on '@'
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
876 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
877
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
878 version(DMDV2) {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
879 StorageClass parseAttribute()
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
880 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
881 nextToken();
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
882 StorageClass stc = STCundefined;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
883 if (token.value != TOKidentifier)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
884 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
885 error("identifier expected after @, not %s", token.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
886 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
887 else if (token.ident == Id.property)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
888 stc = STCproperty;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
889 else if (token.ident == Id.safe)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
890 stc = STCsafe;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
891 else if (token.ident == Id.trusted)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
892 stc = STCtrusted;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
893 else if (token.ident == Id.system)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
894 stc = STCsystem;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
895 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
896 error("valid attribute identifiers are @property, @safe, @trusted, @system, not @%s", token.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
897 return stc;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
898 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
899 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 * Parse constraint.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 * Constraint is of the form:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903 * if ( ConstraintExpression )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 Expression parseConstraint()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
907 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
908 Expression e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
909
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910 if (token.value == TOKif)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912 nextToken(); // skip over 'if'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 check(TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
914 e = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 * Parse a TemplateDeclaration.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 TemplateDeclaration parseTemplateDeclaration()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925 TemplateDeclaration tempdecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 TemplateParameters tpl;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
928 Dsymbols decldefs;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 Expression constraint = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
931
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933 if (token.value != TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 error("TemplateIdentifier expected following template");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 tpl = parseTemplateParameterList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 if (!tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 constraint = parseConstraint();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 if (token.value != TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948 error("members of template declaration expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
951 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
953 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
954 decldefs = parseDeclDefs(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
955 if (token.value != TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 error("template member expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 tempdecl = new TemplateDeclaration(loc, id, tpl, constraint, decldefs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 return tempdecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 Lerr:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 /******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971 * Parse template parameter list.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 * flag 0: parsing "( list )"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 * 1: parsing non-empty "list )"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976 TemplateParameters parseTemplateParameterList(int flag = 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978 TemplateParameters tpl = new TemplateParameters();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 if (!flag && token.value != TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 error("parenthesized TemplateParameterList expected following TemplateIdentifier");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987 // Get array of TemplateParameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 if (flag || token.value != TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 int isvariadic = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 while (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 TemplateParameter tp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 Identifier tp_ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 Type tp_spectype = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 Type tp_valtype = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 Type tp_defaulttype = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 Expression tp_specvalue = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 Expression tp_defaultvalue = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 Token* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 // Get TemplateParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 // First, look ahead to see if it is a TypeParameter or a ValueParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 if (token.value == TOKalias)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 // AliasParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 Type spectype = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 if (isDeclaration(&token, 2, TOKreserved, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 spectype = parseType(&tp_ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 if (token.value != TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020 error("identifier expected for template alias parameter");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 tp_ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026 Object spec = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027 if (token.value == TOKcolon) // : Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1028 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030 if (isDeclaration(&token, 0, TOKreserved, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031 spec = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 spec = parseCondExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 Object def = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 if (token.value == TOKassign) // = Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039 if (isDeclaration(&token, 0, TOKreserved, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 def = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 def = parseCondExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044 tp = new TemplateAliasParameter(loc, tp_ident, spectype, spec, def);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 else if (t.value == TOKcolon || t.value == TOKassign ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1047 t.value == TOKcomma || t.value == TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 { // TypeParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049 if (token.value != TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050 { error("identifier expected for template type parameter");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1053 tp_ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1055 if (token.value == TOKcolon) // : Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1058 tp_spectype = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1059 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1060 if (token.value == TOKassign) // = Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063 tp_defaulttype = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 tp = new TemplateTypeParameter(loc, tp_ident, tp_spectype, tp_defaulttype);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 else if (token.value == TOKidentifier && t.value == TOKdotdotdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 { // ident...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 if (isvariadic)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070 error("variadic template parameter must be last");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1071 isvariadic = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072 tp_ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1073 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1075 tp = new TemplateTupleParameter(loc, tp_ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 /// version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 else if (token.value == TOKthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1079 { // ThisParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1080 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 if (token.value != TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 { error("identifier expected for template this parameter");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1084 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 tp_ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1086 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1087 if (token.value == TOKcolon) // : Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1088 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1090 tp_spectype = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1091 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1092 if (token.value == TOKassign) // = Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1094 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095 tp_defaulttype = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1096 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1097 tp = new TemplateThisParameter(loc, tp_ident, tp_spectype, tp_defaulttype);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1098 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1099 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 { // ValueParameter
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1102 tp_valtype = parseType(&tp_ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 if (!tp_ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 error("identifier expected for template value parameter");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1106 tp_ident = new Identifier("error", TOKidentifier);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 if (token.value == TOKcolon) // : CondExpression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 tp_specvalue = parseCondExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1112 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 if (token.value == TOKassign) // = CondExpression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 tp_defaultvalue = parseDefaultInitExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1117 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 tp = new TemplateValueParameter(loc, tp_ident, tp_valtype, tp_specvalue, tp_defaultvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 }
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1120 tpl.push(tp);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121 if (token.value != TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1122 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1124 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128 Lerr:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1129 return tpl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130 }
19
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1131
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1132 /******************************************
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1133 * Parse template mixin.
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1134 * mixin Foo;
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1135 * mixin Foo!(args);
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1136 * mixin a.b.c!(args).Foo!(args);
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1137 * mixin Foo!(args) identifier;
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1138 * mixin typeof(expr).identifier!(args);
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1139 */
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1140
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 Dsymbol parseMixin()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 {
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1143 TemplateMixin tm;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1144 Identifier id;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1145 Type tqual;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1146 Objects tiargs;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1147 Array idents;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1148
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1149 //printf("parseMixin()\n");
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1150 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1151 tqual = null;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1152 if (token.value == TOKdot)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1153 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1154 id = Id.empty;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1155 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1156 else
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1157 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1158 if (token.value == TOKtypeof)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1159 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1160 tqual = parseTypeof();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1161 check(TOKdot);
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1162 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1163 if (token.value != TOKidentifier)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1164 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1165 error("identifier expected, not %s", token.toChars());
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1166 id = Id.empty;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1167 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1168 else
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1169 id = token.ident;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1170 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1171 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1172
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1173 idents = new Array();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1174 while (1)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1175 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1176 tiargs = null;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1177 if (token.value == TOKnot)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1178 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1179 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1180 if (token.value == TOKlparen)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1181 tiargs = parseTemplateArgumentList();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1182 else
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1183 tiargs = parseTemplateArgument();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1184 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1185 if (token.value != TOKdot)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1186 break;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1187 if (tiargs)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1188 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1189 TemplateInstance tempinst = new TemplateInstance(loc, id);
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1190 tempinst.tiargs = tiargs;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1191 id = cast(Identifier)tempinst;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1192 tiargs = null;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1193 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1194 idents.push(cast(void*)id);
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1195 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1196 if (token.value != TOKidentifier)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1197 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1198 error("identifier expected following '.' instead of '%s'", token.toChars());
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1199 break;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1200 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1201 id = token.ident;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1202 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1203 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1204 idents.push(cast(void*)id);
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1205 if (token.value == TOKidentifier)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1206 {
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1207 id = token.ident;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1208 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1209 }
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1210 else
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1211 id = null;
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1212
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1213 tm = new TemplateMixin(loc, id, tqual, idents, tiargs);
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1214 if (token.value != TOKsemicolon)
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1215 error("';' expected after mixin");
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1216 nextToken();
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 4
diff changeset
1217 return tm;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1218 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1219
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1220 /******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1221 * Parse template argument list.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1222 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1223 * current token is opening '('
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1224 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1225 * current token is one after closing ')'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1226 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1227 Objects parseTemplateArgumentList()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1228 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1229 //printf("Parser.parseTemplateArgumentList()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1230 if (token.value != TOKlparen && token.value != TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1231 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1232 error("!(TemplateArgumentList) expected following TemplateIdentifier");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1233 return new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1234 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1235 return parseTemplateArgumentList2();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1238 Objects parseTemplateArgumentList2()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1239 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1240 //printf("Parser.parseTemplateArgumentList2()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1241 Objects tiargs = new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1242 TOK endtok = TOKrparen;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1243 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1244
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1245 // Get TemplateArgumentList
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1246 if (token.value != endtok)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1247 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1248 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1249 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1250 // See if it is an Expression or a Type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1251 if (isDeclaration(&token, 0, TOKreserved, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1252 { // Template argument is a type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1253 Type ta = parseType();
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1254 tiargs.push(ta);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1255 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1256 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1257 { // Template argument is an expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1258 Expression ea = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1259
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1260 if (ea.op == TOKfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1261 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1262 FuncLiteralDeclaration fd = (cast(FuncExp)ea).fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1263 if (fd.type.ty == Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1265 TypeFunction tf = cast(TypeFunction)fd.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1266 /* If there are parameters that consist of only an identifier,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1267 * rather than assuming the identifier is a type, as we would
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1268 * for regular function declarations, assume the identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1269 * is the parameter name, and we're building a template with
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1270 * a deduced type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1271 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1272 TemplateParameters tpl = null;
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
1273 foreach (param; tf.parameters)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1274 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1275 if (param.ident is null &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1276 param.type &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1277 param.type.ty == Tident &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1278 (cast(TypeIdentifier)param.type).idents.dim == 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1279 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1280 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1281 /* Switch parameter type to parameter identifier,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1282 * parameterize with template type parameter _T
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1283 */
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
1284 auto pt = cast(TypeIdentifier)param.type;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1285 param.ident = pt.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1286 Identifier id = Lexer.uniqueId("__T");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1287 param.type = new TypeIdentifier(pt.loc, id);
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1288 auto tp = new TemplateTypeParameter(fd.loc, id, null, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1289 if (!tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1290 tpl = new TemplateParameters();
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1291 tpl.push(tp);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1292 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1295 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1296 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1297 // Wrap a template around function fd
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1298 auto decldefs = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1299 decldefs.push(fd);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1300 auto tempdecl = new TemplateDeclaration(fd.loc, fd.ident, tpl, null, decldefs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1301 tempdecl.literal = 1; // it's a template 'literal'
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1302 tiargs.push(tempdecl);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1303 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1304 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1305 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1306 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1307
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1308 tiargs.push(ea);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1309 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1310 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1311 if (token.value != TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1312 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1313 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1314 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1315 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1316 check(endtok, "template argument list");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1317 return tiargs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1319
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1320 /*****************************
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1321 * Parse single template argument, to support the syntax:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1322 * foo!arg
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1323 * Input:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1324 * current token is the arg
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1325 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1326 Objects parseTemplateArgument()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1327 {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1328 //printf("parseTemplateArgument()\n");
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1329 Objects tiargs = new Objects();
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1330 Type ta;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1331 switch (token.value)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1332 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1333 case TOKidentifier:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1334 ta = new TypeIdentifier(loc, token.ident);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1335 goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1336
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1337 case TOKvoid: ta = Type.tvoid; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1338 case TOKint8: ta = Type.tint8; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1339 case TOKuns8: ta = Type.tuns8; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1340 case TOKint16: ta = Type.tint16; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1341 case TOKuns16: ta = Type.tuns16; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1342 case TOKint32: ta = Type.tint32; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1343 case TOKuns32: ta = Type.tuns32; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1344 case TOKint64: ta = Type.tint64; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1345 case TOKuns64: ta = Type.tuns64; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1346 case TOKfloat32: ta = Type.tfloat32; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1347 case TOKfloat64: ta = Type.tfloat64; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1348 case TOKfloat80: ta = Type.tfloat80; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1349 case TOKimaginary32: ta = Type.timaginary32; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1350 case TOKimaginary64: ta = Type.timaginary64; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1351 case TOKimaginary80: ta = Type.timaginary80; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1352 case TOKcomplex32: ta = Type.tcomplex32; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1353 case TOKcomplex64: ta = Type.tcomplex64; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1354 case TOKcomplex80: ta = Type.tcomplex80; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1355 case TOKbit: ta = Type.tbit; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1356 case TOKbool: ta = Type.tbool; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1357 case TOKchar: ta = Type.tchar; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1358 case TOKwchar: ta = Type.twchar; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1359 case TOKdchar: ta = Type.tdchar; goto LabelX;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1360 LabelX:
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1361 tiargs.push(ta);
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1362 nextToken();
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1363 break;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1364
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1365 case TOKint32v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1366 case TOKuns32v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1367 case TOKint64v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1368 case TOKuns64v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1369 case TOKfloat32v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1370 case TOKfloat64v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1371 case TOKfloat80v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1372 case TOKimaginary32v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1373 case TOKimaginary64v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1374 case TOKimaginary80v:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1375 case TOKnull:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1376 case TOKtrue:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1377 case TOKfalse:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1378 case TOKcharv:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1379 case TOKwcharv:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1380 case TOKdcharv:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1381 case TOKstring:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1382 case TOKfile:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1383 case TOKline:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1384 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1385 // Template argument is an expression
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1386 Expression ea = parsePrimaryExp();
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1387 tiargs.push(ea);
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1388 break;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1389 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1390
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1391 default:
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1392 error("template argument expected following !");
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1393 break;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1394 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1395
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1396 if (token.value == TOKnot)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1397 error("multiple ! arguments are not allowed");
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1398 return tiargs;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1399 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1400
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1401 /**********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1402 * Parse a static assertion.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1403 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1404 StaticAssert parseStaticAssert()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1405 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1406 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1407 Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1408 Expression msg = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1409
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1410 //printf("parseStaticAssert()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1411 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1412 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1413 exp = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1414 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1415 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1416 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1417 msg = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1418 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1419
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1420 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1421 check(TOK.TOKsemicolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1422
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1423 return new StaticAssert(loc, exp, msg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1424 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1425
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1426 TypeQualified parseTypeof()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1427 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1428 TypeQualified t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1429 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1430
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1431 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1432 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1433 if (token.value == TOK.TOKreturn) // typeof(return)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1434 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1435 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1436 t = new TypeReturn(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1437 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1438 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1439 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1440 Expression exp = parseExpression(); // typeof(expression)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1441 t = new TypeTypeof(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1442 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1443 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1444 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1445 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1446
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1447 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1448 * Parse extern (linkage)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1449 * The parser is on the 'extern' token.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1450 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1451 LINK parseLinkage()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1452 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1453 LINK link = LINK.LINKdefault;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1454 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1455 assert(token.value == TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1456 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1457 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1458 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1459 Identifier id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1460
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1461 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1462 if (id == Id.Windows)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1463 link = LINK.LINKwindows;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1464 else if (id == Id.Pascal)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1465 link = LINK.LINKpascal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1466 else if (id == Id.D)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1467 link = LINK.LINKd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1468 else if (id == Id.C)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1469 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1470 link = LINK.LINKc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1471 if (token.value == TOK.TOKplusplus)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1472 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1473 link = LINK.LINKcpp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1474 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1475 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1476 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1477 else if (id == Id.System)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1478 {
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
1479 version (Windows)
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
1480 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1481 link = LINK.LINKwindows;
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
1482 }
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
1483 else
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 110
diff changeset
1484 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1485 link = LINK.LINKc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1486 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1487 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1488 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1489 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1490 error("valid linkage identifiers are D, C, C++, Pascal, Windows, System");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1491 link = LINK.LINKd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1492 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1493 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1494 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1495 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1496 link = LINK.LINKd; // default
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1497 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1498 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1499
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1500 return link;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1501 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1502
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1503
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1504 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1505 * Parse a debug conditional
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1506 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1507 Condition parseDebugCondition()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1508 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1509 Condition c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1510
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1511 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1512 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1513 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1514 uint level = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1515 Identifier id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1516
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1517 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1518 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1519 else if (token.value == TOK.TOKint32v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1520 level = cast(uint)token.uns64value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1521 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1522 error("identifier or integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1523
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1524 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1525 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1526
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1527 c = new DebugCondition(mod, level, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1528 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1529 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1530 c = new DebugCondition(mod, 1, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1531
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1532 return c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1533 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1534
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1535 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1536 * Parse a version conditional
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1537 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1538 Condition parseVersionCondition()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1539 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1540 Condition c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1541 uint level = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1542 Identifier id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1543
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1544 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1545 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1546 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1547 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1548 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1549 else if (token.value == TOK.TOKint32v)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1550 level = cast(uint)token.uns64value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1551 else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1552 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1553 /* Allow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1554 * version (unittest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1555 * even though unittest is a keyword
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1556 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1557 if (token.value == TOK.TOKunittest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1558 id = Lexer.idPool(Token.toChars(TOK.TOKunittest));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1559 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1560 error("identifier or integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1561 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1562 error("identifier or integer expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1563 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1564 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1565 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1566 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1567 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1568 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1569 error("(condition) expected following version");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1570
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1571 c = new VersionCondition(mod, level, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1572
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1573 return c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1574 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1575
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1576 /***********************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1577 * static if (expression)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1578 * body
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1579 * else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1580 * body
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1581 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1582 Condition parseStaticIfCondition()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1583 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1584 Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1585 Condition condition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1586 Array aif;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1587 Array aelse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1588 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1589
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1590 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1591 if (token.value == TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1592 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1593 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1594 exp = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1595 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1596 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1597 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1598 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1599 error("(expression) expected following static if");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1600 exp = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1601 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1602 condition = new StaticIfCondition(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1603 return condition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1604 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1605
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1606 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1607 * Parse a constructor definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1608 * this(parameters) { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1609 * or postblit:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1610 * this(this) { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1611 * or constructor template:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1612 * this(templateparameters)(parameters) { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1613 * Current token is 'this'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1614 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1615
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1616 Dsymbol parseCtor()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1617 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1618 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1619
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1620 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1621 if (token.value == TOK.TOKlparen && peek(&token).value == TOK.TOKthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1622 { // this(this) { ... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1623 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1624 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1625 check(TOK.TOKrparen);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1626 auto f = new PostBlitDeclaration(loc, Loc(0));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1627 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1628 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1629 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1630
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1631 /* Look ahead to see if:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1632 * this(...)(...)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1633 * which is a constructor template
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1634 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1635 TemplateParameters tpl = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1636 if (token.value == TOK.TOKlparen && peekPastParen(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1637 { tpl = parseTemplateParameterList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1638
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1639 int varargs;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1640 auto arguments = parseParameters(&varargs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1641
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1642 Expression constraint = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1643 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1644 constraint = parseConstraint();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1645
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1646 CtorDeclaration f = new CtorDeclaration(loc, Loc(0), arguments, varargs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1647 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1648
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1649 // Wrap a template around it
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1650 auto decldefs = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1651 decldefs.push(f);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1652 auto tempdecl = new TemplateDeclaration(loc, f.ident, tpl, constraint, decldefs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1653 return tempdecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1654 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1655
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1656 /* Just a regular constructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1657 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1658 int varargs;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1659 auto arguments = parseParameters(&varargs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1660 CtorDeclaration f = new CtorDeclaration(loc, Loc(0), arguments, varargs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1661 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1662 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1663 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1664
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1665 PostBlitDeclaration parsePostBlit()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1666 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1667 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1668 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1669
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1670 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1671 * Parse a destructor definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1672 * ~this() { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1673 * Current token is '~'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1674 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1675 DtorDeclaration parseDtor()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1676 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1677 DtorDeclaration f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1678 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1679
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1680 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1681 check(TOKthis);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1682 check(TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1683 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1684
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1685 f = new DtorDeclaration(loc, Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1686 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1687 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1688 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1689
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1690 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1691 * Parse a static constructor definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1692 * static this() { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1693 * Current token is 'this'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1694 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1695 StaticCtorDeclaration parseStaticCtor()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1696 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1697 StaticCtorDeclaration f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1698 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1699
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1700 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1701 check(TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1702 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1703
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1704 f = new StaticCtorDeclaration(loc, Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1705 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1706 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1707 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1708
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1709 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1710 * Parse a static destructor definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1711 * static ~this() { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1712 * Current token is '~'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1713 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1714 StaticDtorDeclaration parseStaticDtor()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1715 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1716 StaticDtorDeclaration f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1717 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1718
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1719 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1720 check(TOKthis);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1721 check(TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1722 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1723
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1724 f = new StaticDtorDeclaration(loc, Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1725 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1726 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1727 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1728
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1729 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1730 * Parse an invariant definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1731 * invariant() { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1732 * Current token is 'invariant'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1733 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1734 InvariantDeclaration parseInvariant()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1735 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1736 InvariantDeclaration f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1737 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1738
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1739 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1740 if (token.value == TOKlparen) // optional ()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1741 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1742 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1743 check(TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1744 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1745
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1746 f = new InvariantDeclaration(loc, Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1747 f.fbody = parseStatement(ParseStatementFlags.PScurly);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1748 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1749 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1750
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1751 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1752 * Parse a unittest definition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1753 * unittest { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1754 * Current token is 'unittest'.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1755 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1756 UnitTestDeclaration parseUnitTest()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1757 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1758 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1759
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1760 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1761
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1762 UnitTestDeclaration f = new UnitTestDeclaration(loc, this.loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1763 f.fbody = parseStatement(ParseStatementFlags.PScurly);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1764
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1765 return f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1766 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1767
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1768 /*****************************************
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1769 * Parse a new definition:
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1770 * new(arguments) { body }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1771 * Current token is 'new'.
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1772 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1773 NewDeclaration parseNew()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1774 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1775 NewDeclaration f;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1776 scope arguments = new Parameters();
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1777 int varargs;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1778 Loc loc = this.loc;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1779
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1780 nextToken();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1781 arguments = parseParameters(&varargs);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1782 f = new NewDeclaration(loc, Loc(0), arguments, varargs);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1783 parseContracts(f);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1784 return f;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1785 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1786
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1787 /*****************************************
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1788 * Parse a delete definition:
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1789 * delete(arguments) { body }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1790 * Current token is 'delete'.
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1791 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1792 DeleteDeclaration parseDelete()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1793 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1794 DeleteDeclaration f;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1795 scope Parameters arguments;
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1796 int varargs;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1797 Loc loc = this.loc;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1798
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1799 nextToken();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1800 arguments = parseParameters(&varargs);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1801 if (varargs)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1802 error("... not allowed in delete function parameter list");
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1803 f = new DeleteDeclaration(loc, Loc(0), arguments);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1804 parseContracts(f);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 122
diff changeset
1805 return f;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1806 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1807
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1808 Parameters parseParameters(int* pvarargs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1809 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1810 auto arguments = new Parameters();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1811 int varargs = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1812 int hasdefault = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1813
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1814 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1815 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1816 { Type *tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1817 Identifier ai = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1818 Type at;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1819 Parameter a;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
1820 StorageClass storageClass = STC.STCundefined;
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
1821 StorageClass stc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1822 Expression ae;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1823
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1824 for ( ;1; nextToken())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1825 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1826 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1827 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1828 case TOK.TOKrparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1829 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1830
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1831 case TOK.TOKdotdotdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1832 varargs = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1833 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1834 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1835
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1836 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1837 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1838 goto Ldefault;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1839 stc = STC.STCconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1840 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1841
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1842 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1843 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1844 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1845 goto Ldefault;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1846 stc = STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1847 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1848
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1849 case TOK.TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1850 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1851 goto Ldefault;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1852 stc = STC.STCshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1853 goto L2;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1854
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1855 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1856 if (peek(&token).value == TOK.TOKlparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1857 goto Ldefault;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1858 stc = STCwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1859 goto L2;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1860
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1861 case TOK.TOKin: stc = STC.STCin; goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1862 case TOK.TOKout: stc = STC.STCout; goto L2;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1863 version(D1INOUT) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1864 case TOK.TOKinout:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1865 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1866 case TOK.TOKref: stc = STC.STCref; goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1867 case TOK.TOKlazy: stc = STC.STClazy; goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1868 case TOK.TOKscope: stc = STC.STCscope; goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1869 case TOK.TOKfinal: stc = STC.STCfinal; goto L2;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
1870 case TOK.TOKauto: stc = STCauto; goto L2;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1871 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1872 if (storageClass & stc ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1873 (storageClass & STC.STCin && stc & (STC.STCconst | STC.STCscope)) ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1874 (stc & STC.STCin && storageClass & (STC.STCconst | STC.STCscope))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1875 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1876 error("redundant storage class %s", Token.toChars(token.value));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1877 storageClass |= stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1878 composeStorageClass(storageClass);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1879 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1880
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1881 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1882 case TOK.TOKstatic: stc = STC.STCstatic; goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1883 case TOK.TOKauto: storageClass = STC.STCauto; goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1884 case TOK.TOKalias: storageClass = STC.STCalias; goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1885 L4:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1886 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1887 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1888 { ai = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1889 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1890 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1891 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1892 ai = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1893 at = null; // no type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1894 ae = null; // no default argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1895 if (token.value == TOK.TOKassign) // = defaultArg
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1896 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1897 ae = parseDefaultInitExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1898 hasdefault = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1899 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1900 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1901 { if (hasdefault)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1902 error("default argument expected for alias %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1903 ai ? ai.toChars() : "");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1904 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1905 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1906 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1907
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1908 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1909 Ldefault:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1910 stc = (storageClass & (STC.STCin | STC.STCout | STC.STCref | STC.STClazy));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1911 if (stc & (stc - 1)) // if stc is not a power of 2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1912 error("incompatible parameter storage classes");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1913 if ((storageClass & (STC.STCconst | STC.STCout)) == (STC.STCconst | STC.STCout))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1914 error("out cannot be const");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1915 if ((storageClass & (STC.STCimmutable | STC.STCout)) == (STC.STCimmutable | STC.STCout))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1916 error("out cannot be immutable");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1917 if ((storageClass & STC.STCscope) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1918 (storageClass & (STC.STCref | STC.STCout)))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1919 error("scope cannot be ref or out");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1920 at = parseType(&ai);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1921 ae = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1922 if (token.value == TOK.TOKassign) // = defaultArg
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1923 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1924 ae = parseDefaultInitExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1925 hasdefault = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1926 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1927 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1928 { if (hasdefault)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1929 error("default argument expected for %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1930 ai ? ai.toChars() : at.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1931 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1932 if (token.value == TOK.TOKdotdotdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1933 { /* This is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1934 * at ai ...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1935 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1936
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1937 if (storageClass & (STC.STCout | STC.STCref))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1938 error("variadic argument cannot be out or ref");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1939 varargs = 2;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1940 a = new Parameter(storageClass, at, ai, ae);
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
1941 arguments.push(a);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1942 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1943 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1944 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1945 L3:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1946 a = new Parameter(storageClass, at, ai, ae);
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
1947 arguments.push(a);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1948 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1949 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1950 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1951 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1952 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1953 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1954 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1955 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1956 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1957
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1958 L1: ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1959 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1960 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1961 *pvarargs = varargs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1962 return arguments;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1963 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1964
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1965 EnumDeclaration parseEnum()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1966 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1967 EnumDeclaration e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1968 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1969 Type memtype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1970 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1971
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1972 //printf("Parser.parseEnum()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1973 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1974 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1975 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1976 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1977 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1978 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1979 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1980 id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1981
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1982 if (token.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1983 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1984 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1985 memtype = parseBasicType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1986 memtype = parseDeclarator(memtype, null, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1987 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1988 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1989 memtype = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1990
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1991 e = new EnumDeclaration(loc, id, memtype);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1992 if (token.value == TOK.TOKsemicolon && id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1993 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1994 else if (token.value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1995 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1996 //printf("enum definition\n");
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
1997 e.members = new Dsymbols();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1998 nextToken();
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1999 string comment = token.blockComment;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2000 while (token.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2001 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2002 /* Can take the following forms:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2003 * 1. ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2004 * 2. ident = value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2005 * 3. type ident = value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2006 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2007
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2008 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2009
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2010 Type type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2011 Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2012 Token* tp = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2013 if (token.value == TOK.TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2014 (tp.value == TOK.TOKassign || tp.value == TOK.TOKcomma || tp.value == TOK.TOKrcurly))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2015 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2016 ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2017 type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2018 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2019 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2020 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2021 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2022 type = parseType(&ident, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2023 if (id || memtype)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2024 error("type only allowed if anonymous enum and no enum type");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2026
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2027 Expression value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2028 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2029 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2030 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2031 value = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2032 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2033 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2034 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2035 value = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2036 if (type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2037 error("if type, there must be an initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2038 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2039
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2040 auto em = new EnumMember(loc, ident, value, type);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2041 e.members.push(em);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2042
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2043 if (token.value == TOK.TOKrcurly) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2044 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2045 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2046 addComment(em, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2047 comment = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2048 check(TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2049 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2050 addComment(em, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2051 comment = token.blockComment;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2052 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2053 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2054 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2055 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2056 error("enum declaration is invalid");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2057
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2058 //printf("-parseEnum() %s\n", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2059 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2060 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2061
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2062 Dsymbol parseAggregate()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2063 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2064 AggregateDeclaration a = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2065 int anon = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2066 TOK tok;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2067 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2068 TemplateParameters tpl = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2069 Expression constraint = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2070
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2071 //printf("Parser.parseAggregate()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2072 tok = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2073 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2074 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2075 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2076 id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2077 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2078 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2079 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2080 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2081 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2082
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2083 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2084 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2085 // Class template declaration.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2086
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2087 // Gather template parameter list
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2088 tpl = parseTemplateParameterList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2089 constraint = parseConstraint();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2090 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2091 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2092
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2093 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2094 switch (tok)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2095 { case TOK.TOKclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2096 case TOK.TOKinterface:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2097 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2098 if (!id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2099 error("anonymous classes not allowed");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2100
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2101 // Collect base class(es)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2102 BaseClasses baseclasses = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2103 if (token.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2105 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2106 baseclasses = parseBaseClasses();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2107
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2108 if (token.value != TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2109 error("members expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2112 if (tok == TOK.TOKclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2113 a = new ClassDeclaration(loc, id, baseclasses);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2114 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2115 a = new InterfaceDeclaration(loc, id, baseclasses);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2116 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2117 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2118
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2119 case TOK.TOKstruct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2120 if (id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2121 a = new StructDeclaration(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2122 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2123 anon = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2124 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2126 case TOK.TOKunion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2127 if (id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2128 a = new UnionDeclaration(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2129 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2130 anon = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2131 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2132
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2133 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2134 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2135 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2136 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2137 if (a && token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2138 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2140 else if (token.value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2141 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2142 //printf("aggregate definition\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2143 nextToken();
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2144 auto decl = parseDeclDefs(0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2145 if (token.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2146 error("} expected following member declarations in aggregate");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2147 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2148 if (anon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2149 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2150 /* Anonymous structs/unions are more like attributes.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2151 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2152 return new AnonDeclaration(loc, anon - 1, decl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2153 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2154 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2155 a.members = decl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2156 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2157 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2158 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2159 error("{ } expected following aggregate declaration");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2160 a = new StructDeclaration(loc, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2161 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2162
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2163 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2164 { // Wrap a template around the aggregate declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2165
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2166 auto decldefs = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2167 decldefs.push(a);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2168 auto tempdecl = new TemplateDeclaration(loc, id, tpl, constraint, decldefs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2169 return tempdecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2172 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2173 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2174
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2175 BaseClasses parseBaseClasses()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2176 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2177 BaseClasses baseclasses = new BaseClasses();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2178
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2179 for (; 1; nextToken())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2180 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2181 PROT protection = PROT.PROTpublic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2182 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2183 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2184 case TOK.TOKprivate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2185 protection = PROT.PROTprivate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2186 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2187 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2188 case TOK.TOKpackage:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2189 protection = PROT.PROTpackage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2190 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2191 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2192 case TOK.TOKprotected:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2193 protection = PROT.PROTprotected;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2194 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2195 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2196 case TOK.TOKpublic:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2197 protection = PROT.PROTpublic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2198 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2199 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2200 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2201 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2202 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2203 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2204 {
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
2205 auto b = new BaseClass(parseBasicType(), protection);
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
2206 baseclasses.push(b);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2207 if (token.value != TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2208 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2209 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2210 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2211 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2212 error("base classes expected instead of %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2213 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2214 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2215 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2216 return baseclasses;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2217 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2218
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2219 Import parseImport(Dsymbols decldefs, int isstatic)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2220 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2221 Import s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2222 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2223 Identifier aliasid = null;
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
2224 Identifiers a;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2225 Loc loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2226
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2227 //printf("Parser.parseImport()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2228 do
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2229 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2230 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2231 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2232 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2233 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2234 error("Identifier expected following import");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2235 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2238 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2239 a = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2240 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2241 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2242 if (!aliasid && token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2243 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2244 aliasid = id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2245 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2246 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2247 while (token.value == TOK.TOKdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2248 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2249 if (!a)
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
2250 a = new Identifiers();
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
2251 a.push(id);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2252 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2253 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2254 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2255 error("identifier expected following package");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2256 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2257 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2258 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2259 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2260 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2261
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2262 s = new Import(loc, a, id, aliasid, isstatic);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2263 decldefs.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2264
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2265 /* Look for
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2266 * : alias=name, alias=name;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2267 * syntax.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2268 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2269 if (token.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2270 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2271 do
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2272 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2273 Identifier name;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2274
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2275 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2276 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2277 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2278 error("Identifier expected following :");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2279 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2280 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2281 Identifier alias_ = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2282 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2283 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2284 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2285 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2286 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2287 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2288 error("Identifier expected following %s=", alias_.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2289 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2290 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2291 name = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2292 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2294 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2295 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2296 name = alias_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2297 alias_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2298 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2299 s.addAlias(name, alias_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2300 } while (token.value == TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2301
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2302 break; // no comma-separated imports of this form
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2303 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2304
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2305 aliasid = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2306
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2307 } while (token.value == TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2308
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2309 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2310 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2311 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2312 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2313 error("';' expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2314 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2315 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2316
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2317 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2319
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2320 Type parseType(Identifier* pident = null, TemplateParameters* tpl = null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2322 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2323
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2324 /* Take care of the storage class prefixes that
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2325 * serve as type attributes:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2326 * const shared, shared const, const, invariant, shared
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2327 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2328 if (token.value == TOK.TOKconst && peekNext() == TOK.TOKshared && peekNext2() != TOK.TOKlparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2329 token.value == TOK.TOKshared && peekNext() == TOK.TOKconst && peekNext2() != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2330 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2331 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2332 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2333 /* shared const type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2334 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2335 t = parseType(pident, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2336 t = t.makeSharedConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2337 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2338 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2339 else if (token.value == TOKwild && peekNext() == TOKshared && peekNext2() != TOKlparen ||
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2340 token.value == TOKshared && peekNext() == TOKwild && peekNext2() != TOKlparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2341 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2342 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2343 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2344 /* shared wild type
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2345 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2346 t = parseType(pident, tpl);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2347 t = t.makeSharedWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2348 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2349 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2350 else if (token.value == TOK.TOKconst && peekNext() != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2351 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2352 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2353 /* const type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2354 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2355 t = parseType(pident, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2356 t = t.makeConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2357 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2358 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2359 else if ((token.value == TOK.TOKinvariant || token.value == TOK.TOKimmutable) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2360 peekNext() != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2361 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2362 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2363 /* invariant type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2364 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2365 t = parseType(pident, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2366 t = t.makeInvariant();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2367 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2368 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2369 else if (token.value == TOK.TOKshared && peekNext() != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2370 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2371 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2372 /* shared type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2373 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2374 t = parseType(pident, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2375 t = t.makeShared();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2376 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2377 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2378 else if (token.value == TOKwild && peekNext() != TOKlparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2379 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2380 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2381 /* wild type
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2382 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2383 t = parseType(pident, tpl);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2384 t = t.makeWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2385 return t;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2386 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2387 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2388 t = parseBasicType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2389 t = parseDeclarator(t, pident, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2390 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2391 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2392
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2393 Type parseBasicType()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2394 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2395 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2396 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2397 TypeQualified tid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2398
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2399 //printf("parseBasicType()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2400 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2401 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2402 case TOK.TOKvoid: t = Type.tvoid; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2403 case TOK.TOKint8: t = Type.tint8; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2404 case TOK.TOKuns8: t = Type.tuns8; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2405 case TOK.TOKint16: t = Type.tint16; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2406 case TOK.TOKuns16: t = Type.tuns16; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2407 case TOK.TOKint32: t = Type.tint32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2408 case TOK.TOKuns32: t = Type.tuns32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2409 case TOK.TOKint64: t = Type.tint64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2410 case TOK.TOKuns64: t = Type.tuns64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2411 case TOK.TOKfloat32: t = Type.tfloat32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2412 case TOK.TOKfloat64: t = Type.tfloat64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2413 case TOK.TOKfloat80: t = Type.tfloat80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2414 case TOK.TOKimaginary32: t = Type.timaginary32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2415 case TOK.TOKimaginary64: t = Type.timaginary64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2416 case TOK.TOKimaginary80: t = Type.timaginary80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2417 case TOK.TOKcomplex32: t = Type.tcomplex32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2418 case TOK.TOKcomplex64: t = Type.tcomplex64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2419 case TOK.TOKcomplex80: t = Type.tcomplex80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2420 case TOK.TOKbit: t = Type.tbit; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2421 case TOK.TOKbool: t = Type.tbool; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2422 case TOK.TOKchar: t = Type.tchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2423 case TOK.TOKwchar: t = Type.twchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2424 case TOK.TOKdchar: t = Type.tdchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2425 LabelX:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2426 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2427 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2428
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2429 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2430 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2431 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2432 if (token.value == TOK.TOKnot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2433 { // ident!(template_arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2434 TemplateInstance tempinst = new TemplateInstance(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2435 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2436 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2437 // ident!(template_arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2438 tempinst.tiargs = parseTemplateArgumentList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2439 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2440 // ident!template_argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2441 tempinst.tiargs = parseTemplateArgument();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2442 tid = new TypeInstance(loc, tempinst);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2443 goto Lident2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2444 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2445 Lident:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2446 tid = new TypeIdentifier(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2447 Lident2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2448 while (token.value == TOK.TOKdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2449 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2450 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2451 { error("identifier expected following '.' instead of '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2452 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2453 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2454 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2455 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2456 if (token.value == TOK.TOKnot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2457 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2458 TemplateInstance tempinst = new TemplateInstance(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2459 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2460 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2461 // ident!(template_arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2462 tempinst.tiargs = parseTemplateArgumentList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2463 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2464 // ident!template_argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2465 tempinst.tiargs = parseTemplateArgument();
56
51605de93870 TupleExp.optimize
korDen
parents: 34
diff changeset
2466 tid.addIdent(tempinst);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2467 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2468 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2469 tid.addIdent(id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2470 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2471 t = tid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2472 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2473
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2474 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2475 // Leading . as in .foo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2476 id = Id.empty;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2477 goto Lident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2478
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2479 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2480 // typeof(expression)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2481 tid = parseTypeof();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2482 goto Lident2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2483
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2484 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2485 // const(type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2486 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2487 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2488 t = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2489 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2490 if (t.isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2491 t = t.makeSharedConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2492 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2493 t = t.makeConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2494 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2495
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2496 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2497 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2498 // invariant(type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2499 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2500 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2501 t = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2502 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2503 t = t.makeInvariant();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2504 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2505
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2506 case TOK.TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2507 // shared(type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2508 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2509 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2510 t = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2511 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2512 if (t.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2513 t = t.makeSharedConst();
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2514 else if (t.isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2515 t = t.makeSharedWild();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2516 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2517 t = t.makeShared();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2518 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2519
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2520 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2521 // wild(type)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2522 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2523 check(TOK.TOKlparen);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2524 t = parseType();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2525 check(TOK.TOKrparen);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2526 if (t.isShared())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2527 t = t.makeSharedWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2528 else
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2529 t = t.makeWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2530 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2531
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2532 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2533 error("basic type expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2534 t = Type.tint32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2535 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2536 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2537 return t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2538 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2539
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2540 Type parseBasicType2(Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2541 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2542 //writef("parseBasicType2()\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2543 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2544 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2545 switch (token.value)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2546 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2547 case TOK.TOKmul:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2548 t = new TypePointer(t);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2549 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2550 continue;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2551
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2552 case TOK.TOKlbracket:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2553 // Handle []. Make sure things like
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2554 // int[3][1] a;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2555 // is (array[1] of array[3] of int)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2556 nextToken();
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2557 if (token.value == TOK.TOKrbracket)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2558 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2559 t = new TypeDArray(t); // []
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2560 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2561 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2562 else if (token.value == TOKnew && peekNext() == TOKrbracket)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2563 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2564 t = new TypeNewArray(t); // [new]
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2565 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2566 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2567 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2568 else if (isDeclaration(&token, 0, TOK.TOKrbracket, null))
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2569 { // It's an associative array declaration
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2570
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2571 //printf("it's an associative array\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2572 Type index = parseType(); // [ type ]
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2573 t = new TypeAArray(t, index);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2574 check(TOK.TOKrbracket);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2575 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2576 else
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2577 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2578 //printf("it's type[expression]\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2579 inBrackets++;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2580 Expression e = parseAssignExp(); // [ expression ]
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2581 if (token.value == TOK.TOKslice)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2582 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2583 nextToken();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2584 Expression e2 = parseAssignExp(); // [ exp .. exp ]
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2585 t = new TypeSlice(t, e, e2);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2586 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2587 else
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2588 t = new TypeSArray(t,e);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2589 inBrackets--;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2590 check(TOK.TOKrbracket);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2591 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2592 continue;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2593
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2594 case TOK.TOKdelegate:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2595 case TOK.TOKfunction:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2596 { // Handle delegate declaration:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2597 // t delegate(parameter list) nothrow pure
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2598 // t function(parameter list) nothrow pure
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2599 Parameters arguments;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2600 int varargs;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2601 bool ispure = false;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2602 bool isnothrow = false;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2603 bool isproperty = false;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2604 TOK save = token.value;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2605 TRUST trust = TRUSTdefault;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2606
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2607 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2608 arguments = parseParameters(&varargs);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2609 while (1)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2610 { // Postfixes
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2611 if (token.value == TOK.TOKpure)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2612 ispure = true;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2613 else if (token.value == TOK.TOKnothrow)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2614 isnothrow = true;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2615 else if (token.value == TOKat)
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2616 { StorageClass stc = parseAttribute();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2617 switch (cast(uint)(stc >> 32))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2618 { case STCproperty >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2619 isproperty = true;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2620 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2621 case STCsafe >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2622 trust = TRUSTsafe;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2623 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2624 case STCsystem >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2625 trust = TRUSTsystem;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2626 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2627 case STCtrusted >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2628 trust = TRUSTtrusted;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2629 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2630 case 0:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2631 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2632 default:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2633 assert(0);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2634 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2635 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2636 else
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2637 break;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2638 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2639 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2640 TypeFunction tf = new TypeFunction(arguments, t, varargs, linkage);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2641 tf.ispure = ispure;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2642 tf.isnothrow = isnothrow;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2643 tf.isproperty = isproperty;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2644 tf.trust = trust;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2645 if (save == TOK.TOKdelegate)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2646 t = new TypeDelegate(tf);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2647 else
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2648 t = new TypePointer(tf); // pointer to function
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2649 continue;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2650 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2651
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2652 default:
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2653 return t;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2654 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2655 assert(0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2656 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2657 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2658 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2659 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2660
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2661 Type parseDeclarator(Type t, Identifier* pident, TemplateParameters* tpl = null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2662 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2663 Type ts;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2664
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2665 //printf("parseDeclarator(tpl = %p)\n", tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2666 t = parseBasicType2(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2667
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2668 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2669 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2670
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2671 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2672 if (pident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2673 *pident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2674 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2675 error("unexpected identifer '%s' in declarator", token.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2676 ts = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2677 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2678 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2679
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2680 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2681 /* Parse things with parentheses around the identifier, like:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2682 * int (*ident[3])[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2683 * although the D style would be:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2684 * int[]*[3] ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2685 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2686 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2687 ts = parseDeclarator(t, pident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2688 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2689 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2690
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2691 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2692 ts = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2693 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2694 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2695
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2696 // parse DeclaratorSuffixes
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2697 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2698 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2699 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2700 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2701 version (CARRAYDECL) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2702 /* Support C style array syntax:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2703 * int ident[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2704 * as opposed to D-style:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2705 * int[] ident
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2706 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2707 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2708 { // This is the old C-style post [] syntax.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2709 TypeNext ta;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2710 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2711 if (token.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2712 { // It's a dynamic array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2713 ta = new TypeDArray(t); // []
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2714 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2715 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2716 else if (token.value == TOKnew && peekNext() == TOKrbracket)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2717 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2718 t = new TypeNewArray(t); // [new]
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2719 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2720 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2721 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2722 else if (isDeclaration(&token, 0, TOK.TOKrbracket, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2723 { // It's an associative array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2724
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2725 //printf("it's an associative array\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2726 Type index = parseType(); // [ type ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2727 check(TOK.TOKrbracket);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2728 ta = new TypeAArray(t, index);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2729 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2730 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2731 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2732 //printf("It's a static array\n");
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2733 Expression e = parseAssignExp(); // [ expression ]
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2734 ta = new TypeSArray(t, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2735 check(TOK.TOKrbracket);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2736 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2737
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2738 /* Insert ta into
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2739 * ts . ... . t
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2740 * so that
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2741 * ts . ... . ta . t
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2742 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2743 Type* pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2744 for (pt = &ts; *pt !is t; pt = &(cast(TypeNext)*pt).next) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2745 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2746 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2747 *pt = ta;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2748 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2749 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2750 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2751 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2752 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2753 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2754 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2755 /* Look ahead to see if this is (...)(...),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2756 * i.e. a function template declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2757 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2758 if (peekPastParen(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2759 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2760 //printf("function template declaration\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2761
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2762 // Gather template parameter list
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2763 *tpl = parseTemplateParameterList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2764 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2765 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2766
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2767 int varargs;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2768 auto arguments = parseParameters(&varargs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2769 Type tf = new TypeFunction(arguments, t, varargs, linkage);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2770
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2771 /* Parse const/invariant/nothrow/pure postfix
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2772 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2773 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2774 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2775 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2776 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2777 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2778 if (tf.isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2779 tf = tf.makeSharedConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2780 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2781 tf = tf.makeConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2782 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2783 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2784
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2785 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2786 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2787 tf = tf.makeInvariant();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2788 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2789 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2790
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2791 case TOK.TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2792 if (tf.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2793 tf = tf.makeSharedConst();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2794 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2795 tf = tf.makeShared();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2796 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2797 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2798
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2799 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2800 if (tf.isShared())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2801 tf = tf.makeSharedWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2802 else
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2803 tf = tf.makeWild();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2804 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2805 continue;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2806
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2807 case TOK.TOKnothrow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2808 (cast(TypeFunction)tf).isnothrow = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2809 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2810 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2811
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2812 case TOK.TOKpure:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2813 (cast(TypeFunction)tf).ispure = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2814 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2815 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2816
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2817 case TOK.TOKat:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2818 {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2819 StorageClass stc = parseAttribute();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2820 auto tfunc = cast(TypeFunction)tf;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2821 switch (cast(uint)(stc >> 32))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2822 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2823 case STCproperty >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2824 tfunc.isproperty = 1;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2825 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2826 case STCsafe >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2827 tfunc.trust = TRUSTsafe;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2828 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2829 case STCsystem >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2830 tfunc.trust = TRUSTsystem;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2831 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2832 case STCtrusted >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2833 tfunc.trust = TRUSTtrusted;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2834 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2835 case 0:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2836 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2837 default:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2838 assert(0);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2839 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2840 nextToken();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2841 continue;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2842 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2843 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2844 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2845 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2846 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2847 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2848
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2849 /* Insert tf into
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2850 * ts . ... . t
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2851 * so that
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2852 * ts . ... . tf . t
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2853 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2854 Type* pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2855 for (pt = &ts; *pt !is t; pt = &(cast(TypeNext)*pt).next) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2856 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2857 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2858 *pt = tf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2859 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2860 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2861
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2862 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2863 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2864 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2865 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2866 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2867
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2868 return ts;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2869 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2870
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2871 Dsymbols parseDeclarations(StorageClass storage_class)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2872 {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
2873 StorageClass stc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2874 Type ts;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2875 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2876 Type tfirst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2877 Identifier ident;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2878 Dsymbols a;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2879 TOK tok = TOK.TOKreserved;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
2880 string comment = token.blockComment;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2881 LINK link = linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2882
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2883 //printf("parseDeclarations() %s\n", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2884 if (storage_class)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2885 { ts = null; // infer type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2886 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2887 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2888
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2889 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2890 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2891 case TOK.TOKalias:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2892 /* Look for:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2893 * alias identifier this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2894 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2895 tok = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2896 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2897 if (token.value == TOK.TOKidentifier && peek(&token).value == TOK.TOKthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2898 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2899 AliasThis s = new AliasThis(this.loc, token.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2900 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2901 check(TOK.TOKthis);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2902 check(TOK.TOKsemicolon);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2903 a = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
2904 a.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2905 addComment(s, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2906 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2907 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2908 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2909 case TOK.TOKtypedef:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2910 tok = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2911 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2912 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2913 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2914 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2915 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2916
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2917 storage_class = STC.STCundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2918 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2919 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2920 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2921 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2922 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2923 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2924 break; // const as type constructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2925 stc = STC.STCconst; // const as storage class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2926 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2927
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2928 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2929 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2930 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2931 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2932 stc = STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2933 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2934
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2935 case TOK.TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2936 if (peek(&token).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2937 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2938 stc = STC.STCshared;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2939 goto L1;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2940
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2941 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2942 if (peek(&token).value == TOK.TOKlparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2943 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
2944 stc = STC.STCwild;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2945 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2946
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2947 case TOK.TOKstatic: stc = STC.STCstatic; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2948 case TOK.TOKfinal: stc = STC.STCfinal; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2949 case TOK.TOKauto: stc = STC.STCauto; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2950 case TOK.TOKscope: stc = STC.STCscope; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2951 case TOK.TOKoverride: stc = STC.STCoverride; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2952 case TOK.TOKabstract: stc = STC.STCabstract; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2953 case TOK.TOKsynchronized: stc = STC.STCsynchronized; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2954 case TOK.TOKdeprecated: stc = STC.STCdeprecated; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2955 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2956 case TOK.TOKnothrow: stc = STC.STCnothrow; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2957 case TOK.TOKpure: stc = STC.STCpure; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2958 case TOK.TOKref: stc = STC.STCref; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2959 case TOK.TOKtls: stc = STC.STCtls; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2960 case TOK.TOKgshared: stc = STC.STCgshared; goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2961 case TOK.TOKenum: stc = STC.STCmanifest; goto L1;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
2962 case TOK.TOKat: stc = parseAttribute(); goto L1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2963 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2964 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2965 if (storage_class & stc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2966 error("redundant storage class '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2967 storage_class = (storage_class | stc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2968 composeStorageClass(storage_class);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2969 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2970 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2971
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2972 case TOK.TOKextern:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2973 if (peek(&token).value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2974 { stc = STC.STCextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2975 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2976 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2977
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2978 link = parseLinkage();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2979 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2980
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2981 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2982 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2983 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2984 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2985 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2986
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2987 /* Look for auto initializers:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2988 * storage_class identifier = initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2989 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2990 if (storage_class &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2991 token.value == TOK.TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2992 peek(&token).value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2993 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2994 return parseAutoDeclarations(storage_class, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2995 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2996
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2997 if (token.value == TOK.TOKclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2998 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2999 AggregateDeclaration s = cast(AggregateDeclaration)parseAggregate();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3000 s.storage_class |= storage_class;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3001 a = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3002 a.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3003 addComment(s, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3004 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3005 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3006
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3007 /* Look for return type inference for template functions.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3008 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3009 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3010 Token *tk;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3011 if (storage_class &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3012 token.value == TOK.TOKidentifier &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3013 (tk = peek(&token)).value == TOK.TOKlparen &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3014 skipParens(tk, &tk) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3015 peek(tk).value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3016 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3017 ts = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3018 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3019 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3020 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3021 ts = parseBasicType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3022 ts = parseBasicType2(ts);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3023 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3024 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3025
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3026 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3027 tfirst = null;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3028 a = new Dsymbols();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3029
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3030 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3031 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3032 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3033 TemplateParameters tpl = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3034
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3035 ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3036 t = parseDeclarator(ts, &ident, &tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3037 assert(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3038 if (!tfirst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3039 tfirst = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3040 else if (t != tfirst)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3041 error("multiple declarations must have the same type, not %s and %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3042 tfirst.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3043 if (!ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3044 error("no identifier for declarator %s", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3045
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3046 if (tok == TOK.TOKtypedef || tok == TOK.TOKalias)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3047 { Declaration v;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3048 Initializer init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3049
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3050 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3051 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3052 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3053 init = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3054 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3055 if (tok == TOK.TOKtypedef)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3056 v = new TypedefDeclaration(loc, ident, t, init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3057 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3058 { if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3059 error("alias cannot have initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3060 v = new AliasDeclaration(loc, ident, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3061 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3062 v.storage_class = storage_class;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3063 if (link == linkage)
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3064 a.push(v);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3065 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3066 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3067 auto ax = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3068 ax.push(v);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3069 Dsymbol s = new LinkDeclaration(link, ax);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3070 a.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3071 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3072 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3073 { case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3074 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3075 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3076 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3077
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3078 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3079 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3080 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3081 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3082
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3083 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3084 error("semicolon expected to close %s declaration", Token.toChars(tok));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3085 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3086 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3087 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3088 else if (t.ty == TY.Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3089 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3090 auto tf = cast(TypeFunction)t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3091 Expression constraint = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3092 static if (false) {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3093 if (Parameter.isTPL(tf.parameters))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3094 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3095 if (!tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3096 tpl = new TemplateParameters();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3097 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3098 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3099 FuncDeclaration f =
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3100 new FuncDeclaration(loc, Loc(0), ident, storage_class, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3101 addComment(f, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3102 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3103 constraint = parseConstraint();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3104 parseContracts(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3105 addComment(f, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3106 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3107 if (link == linkage)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3108 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3109 s = f;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3111 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3112 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3113 auto ax = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3114 ax.push(f);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3115 s = new LinkDeclaration(link, ax);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3116 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3117 /* A template parameter list means it's a function template
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3118 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3119 if (tpl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3120 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3121 // Wrap a template around the function declaration
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3122 auto decldefs = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3123 decldefs.push(s);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3124 auto tempdecl =
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3125 new TemplateDeclaration(loc, s.ident, tpl, constraint, decldefs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3126 s = tempdecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3127 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3128 addComment(s, comment);
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3129 a.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3130 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3131 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3133 Initializer init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3134 if (token.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3135 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3136 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3137 init = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3138 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3139
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3140 VarDeclaration v = new VarDeclaration(loc, t, ident, init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3141 v.storage_class = storage_class;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3142 if (link == linkage)
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3143 a.push(v);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3144 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3145 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3146 auto ax = new Dsymbols();
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3147 ax.push(v);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3148 auto s = new LinkDeclaration(link, ax);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3149 a.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3151 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3152 { case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3153 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3154 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3155 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3156
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3157 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3158 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3159 addComment(v, comment);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3160 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3161
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3162 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3163 error("semicolon expected, not '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3164 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3165 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3166 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3167 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3168 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3169 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3172 void parseContracts(FuncDeclaration f)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3173 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3174 LINK linksave = linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3175
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3176 // The following is irrelevant, as it is overridden by sc.linkage in
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3177 // TypeFunction.semantic
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3178 linkage = LINK.LINKd; // nested functions have D linkage
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3179 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3180 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3181 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3182 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3183 if (f.frequire || f.fensure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3184 error("missing body { ... } after in or out");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3185 f.fbody = parseStatement(ParseStatementFlags.PSsemi);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3186 f.endloc = endloc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3187 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3189 case TOK.TOKbody:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3190 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3191 f.fbody = parseStatement(ParseStatementFlags.PScurly);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3192 f.endloc = endloc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3193 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3194
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3195 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3196 if (f.frequire || f.fensure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3197 error("missing body { ... } after in or out");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3198 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3199 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3201 static if (false) { // Do we want this for function declarations, so we can do:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3202 // int x, y, foo(), z;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3203 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3204 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3205 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3206 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3207
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3208 static if (false) { // Dumped feature
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3209 case TOK.TOKthrow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3210 if (!f.fthrows)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3211 f.fthrows = new Array();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3212 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3213 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3214 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3215 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3216 Type tb = parseBasicType();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3217 f.fthrows.push(tb);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3218 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3219 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3220 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3221 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3222 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3223 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3224 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3225 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3226 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3227
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3228 case TOK.TOKin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3229 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3230 if (f.frequire)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3231 error("redundant 'in' statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3232 f.frequire = parseStatement(ParseStatementFlags.PScurly | ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3233 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3234
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3235 case TOK.TOKout:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3236 // parse: out (identifier) { statement }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3237 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3238 if (token.value != TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3239 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3240 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3241 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3242 error("(identifier) following 'out' expected, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3243 f.outId = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3244 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3245 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3246 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3247 if (f.fensure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3248 error("redundant 'out' statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3249 f.fensure = parseStatement(ParseStatementFlags.PScurly | ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3250 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3252 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3253 error("semicolon expected following function declaration");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3254 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3255 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3256 linkage = linksave;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3257 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3258
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3259 Statement parseStatement(ParseStatementFlags flags)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3260 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3261 Statement s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3262 Token* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3263 Condition condition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3264 Statement ifbody;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3265 Statement elsebody;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3266 bool isfinal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3267 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3268
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3269 //printf("parseStatement()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3270
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3271 if (flags & ParseStatementFlags.PScurly && token.value != TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3272 error("statement expected to be { }, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3274 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3275 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3276 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3277 /* A leading identifier can be a declaration, label, or expression.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3278 * The easiest case to check first is label:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3279 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3280 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3281 if (t.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3282 { // It's a label
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3283
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3284 Identifier ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3285 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3286 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3287 s = parseStatement(ParseStatementFlags.PSsemi);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3288 s = new LabelStatement(loc, ident, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3289 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3290 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3291 // fallthrough to TOK.TOKdot
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3292 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3293 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3294 if (isDeclaration(&token, 2, TOK.TOKreserved, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3295 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3296 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3297 goto Lexp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3298 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3299
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3300 case TOK.TOKassert:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3301 case TOK.TOKthis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3302 case TOK.TOKsuper:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3303 case TOK.TOKint32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3304 case TOK.TOKuns32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3305 case TOK.TOKint64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3306 case TOK.TOKuns64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3307 case TOK.TOKfloat32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3308 case TOK.TOKfloat64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3309 case TOK.TOKfloat80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3310 case TOK.TOKimaginary32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3311 case TOK.TOKimaginary64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3312 case TOK.TOKimaginary80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3313 case TOK.TOKcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3314 case TOK.TOKwcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3315 case TOK.TOKdcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3316 case TOK.TOKnull:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3317 case TOK.TOKtrue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3318 case TOK.TOKfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3319 case TOK.TOKstring:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3320 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3321 case TOK.TOKcast:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3322 case TOK.TOKmul:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3323 case TOK.TOKmin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3324 case TOK.TOKadd:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3325 case TOK.TOKplusplus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3326 case TOK.TOKminusminus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3327 case TOK.TOKnew:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3328 case TOK.TOKdelete:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3329 case TOK.TOKdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3330 case TOK.TOKfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3331 case TOK.TOKtypeid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3332 case TOK.TOKis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3333 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3334 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3335 case TOK.TOKtraits:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3336 case TOK.TOKfile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3337 case TOK.TOKline:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3338 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3339 Lexp:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3340 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3341 auto exp = parseExpression();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3342 check(TOK.TOKsemicolon, "statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3343 s = new ExpStatement(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3344 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3345 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3346
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3347 case TOK.TOKstatic:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3348 { // Look ahead to see if it's static assert() or static if()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3349 Token *tt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3350
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3351 tt = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3352 if (tt.value == TOK.TOKassert)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3353 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3354 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3355 s = new StaticAssertStatement(parseStaticAssert());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3356 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3357 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3358 if (tt.value == TOK.TOKif)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3359 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3360 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3361 condition = parseStaticIfCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3362 goto Lcondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3363 }
132
c494af1dba80 Fixes for dmd 2.037
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
3364 if (tt.value == TOK.TOKstruct || tt.value == TOK.TOKunion || tt.value == TOK.TOKclass)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3365 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3366 nextToken();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3367 auto a = parseBlock();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3368 Dsymbol d = new StorageClassDeclaration(STCstatic, a);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3369 s = new DeclarationStatement(loc, d);
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
3370 if (flags & ParseStatementFlags.PSscope)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3371 s = new ScopeStatement(loc, s);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3372 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3373 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3374 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3375 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3376
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3377 case TOK.TOKfinal:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3378 if (peekNext() == TOK.TOKswitch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3379 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3380 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3381 isfinal = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3382 goto Lswitch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3383 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3384 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3385
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3386 case TOK.TOKwchar: case TOK.TOKdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3387 case TOK.TOKbit: case TOK.TOKbool: case TOK.TOKchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3388 case TOK.TOKint8: case TOK.TOKuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3389 case TOK.TOKint16: case TOK.TOKuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3390 case TOK.TOKint32: case TOK.TOKuns32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3391 case TOK.TOKint64: case TOK.TOKuns64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3392 case TOK.TOKfloat32: case TOK.TOKfloat64: case TOK.TOKfloat80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3393 case TOK.TOKimaginary32: case TOK.TOKimaginary64: case TOK.TOKimaginary80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3394 case TOK.TOKcomplex32: case TOK.TOKcomplex64: case TOK.TOKcomplex80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3395 case TOK.TOKvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3396 case TOK.TOKtypedef:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3397 case TOK.TOKalias:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3398 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3399 case TOK.TOKauto:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3400 case TOK.TOKextern:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3401 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3402 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3403 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3404 case TOK.TOKshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3405 case TOKwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3406 case TOK.TOKnothrow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3407 case TOK.TOKpure:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3408 case TOK.TOKtls:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3409 case TOK.TOKgshared:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3410 case TOK.TOKat:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3411 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3412 // case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3413 Ldeclaration:
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
3414 { Dsymbols a;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3415
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3416 a = parseDeclarations(STC.STCundefined);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3417 if (a.dim > 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3418 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3419 Statements as = new Statements();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3420 as.reserve(a.dim);
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
3421 foreach(Dsymbol d; a)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3422 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3423 s = new DeclarationStatement(loc, d);
122
c77e9f4f1793 Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
3424 as.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3425 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3426 s = new CompoundDeclarationStatement(loc, as);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3427 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3428 else if (a.dim == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3429 {
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
3430 auto d = a[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3431 s = new DeclarationStatement(loc, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3432 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3433 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3434 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3435 if (flags & ParseStatementFlags.PSscope)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3436 s = new ScopeStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3437 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3438 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3439
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3440 case TOK.TOKstruct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3441 case TOK.TOKunion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3442 case TOK.TOKclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3443 case TOK.TOKinterface:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3444 { Dsymbol d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3445
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3446 d = parseAggregate();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3447 s = new DeclarationStatement(loc, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3448 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3449 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3450
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3451 case TOK.TOKenum:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3452 { /* Determine if this is a manifest constant declaration,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3453 * or a conventional enum.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3454 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3455 Dsymbol d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3456 Token* tt = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3457 if (tt.value == TOK.TOKlcurly || tt.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3458 d = parseEnum();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3459 else if (tt.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3460 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3461 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3462 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3463 tt = peek(tt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3464 if (tt.value == TOK.TOKlcurly || tt.value == TOK.TOKcolon ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3465 tt.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3466 d = parseEnum();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3467 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3468 goto Ldeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3469 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3470 s = new DeclarationStatement(loc, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3471 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3472 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3473
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3474 case TOK.TOKmixin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3475 { t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3476 if (t.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3477 { // mixin(string)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3478 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3479 check(TOK.TOKlparen, "mixin");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3480 Expression e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3481 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3482 check(TOK.TOKsemicolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3483 s = new CompileStatement(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3484 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3485 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3486 Dsymbol d = parseMixin();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3487 s = new DeclarationStatement(loc, d);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3488 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3489 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3490
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3491 case TOK.TOKlcurly:
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3492 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3493 nextToken();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3494 Statements statements = new Statements();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3495 while (token.value != TOK.TOKrcurly && token.value != TOKeof)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3496 {
122
c77e9f4f1793 Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
3497 statements.push(parseStatement(ParseStatementFlags.PSsemi | ParseStatementFlags.PScurlyscope));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3498 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3499 endloc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3500 s = new CompoundStatement(loc, statements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3501 if (flags & (ParseStatementFlags.PSscope | ParseStatementFlags.PScurlyscope))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3502 s = new ScopeStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3503 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3504 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3505 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3506
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3507 case TOK.TOKwhile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3508 { Expression condition2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3509 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3510
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3511 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3512 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3513 condition2 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3514 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3515 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3516 s = new WhileStatement(loc, condition2, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3517 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3518 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3519
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3520 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3521 if (!(flags & ParseStatementFlags.PSsemi))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3522 error("use '{ }' for an empty statement, not a ';'");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3523 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3524 s = new ExpStatement(loc, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3525 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3526
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3527 case TOK.TOKdo:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3528 { Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3529 Expression condition2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3530
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3531 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3532 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3533 check(TOK.TOKwhile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3534 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3535 condition2 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3536 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3537 s = new DoStatement(loc, body_, condition2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3538 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3539 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3540
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3541 case TOK.TOKfor:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3542 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3543 Statement init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3544 Expression condition2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3545 Expression increment;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3546 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3547
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3548 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3549 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3550 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3551 { init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3552 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3553 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3554 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3555 { init = parseStatement(cast(ParseStatementFlags)0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3556 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3557 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3558 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3559 condition2 = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3560 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3561 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3562 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3563 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3564 condition2 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3565 check(TOK.TOKsemicolon, "for condition");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3566 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3567 if (token.value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3568 { increment = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3569 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3570 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3571 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3572 { increment = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3573 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3574 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3575 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3576 s = new ForStatement(loc, init, condition2, increment, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3577 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3578 s = new ScopeStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3579 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3580 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3581
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3582 case TOK.TOKforeach:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3583 case TOK.TOKforeach_reverse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3584 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3585 TOK op = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3586
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3587 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3588 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3589
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3590 auto arguments = new Parameters();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3591
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3592 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3593 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3594 Identifier ai = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3595 Type at;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
3596 StorageClass storageClass = STC.STCundefined;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3597
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3598 if (token.value == TOKref
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3599 //#if D1INOUT
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3600 // || token.value == TOKinout
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3601 //#endif
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
3602 )
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3603 { storageClass = STC.STCref;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3604 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3605 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3606 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3607 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3608 Token *tt = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3609 if (tt.value == TOK.TOKcomma || tt.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3610 { ai = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3611 at = null; // infer argument type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3612 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3613 goto Larg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3614 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3615 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3616 at = parseType(&ai);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3617 if (!ai)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3618 error("no identifier for declarator %s", at.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3619 Larg:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3620 auto a = new Parameter(storageClass, at, ai, null);
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
3621 arguments.push(a);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3622 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3623 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3624 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3625 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3626 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3627 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3628 check(TOK.TOKsemicolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3629
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3630 Expression aggr = parseExpression();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3631 if (token.value == TOK.TOKslice && arguments.dim == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3632 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 125
diff changeset
3633 auto a = arguments[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3634 delete arguments;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3635 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3636 Expression upr = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3637 check(TOK.TOKrparen);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3638 auto body_ = parseStatement(cast(ParseStatementFlags)0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3639 s = new ForeachRangeStatement(loc, op, a, aggr, upr, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3640 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3641 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3642 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3643 check(TOK.TOKrparen);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3644 auto body_ = parseStatement(cast(ParseStatementFlags)0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3645 s = new ForeachStatement(loc, op, arguments, aggr, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3646 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3647 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3648 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3649
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3650 case TOK.TOKif:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3651 { Parameter arg = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3652 Expression condition2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3653 Statement ifbody2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3654 Statement elsebody2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3655
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3656 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3657 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3658
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3659 if (token.value == TOK.TOKauto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3660 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3661 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3662 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3663 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3664 Token *tt = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3665 if (tt.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3666 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3667 arg = new Parameter(STC.STCundefined, null, token.ident, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3668 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3669 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3670 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3671 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3672 { error("= expected following auto identifier");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3673 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3674 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3675 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3676 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3677 { error("identifier expected following auto");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3678 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3679 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3680 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3681 else if (isDeclaration(&token, 2, TOK.TOKassign, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3682 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3683 Type at;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3684 Identifier ai;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3685
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3686 at = parseType(&ai);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3687 check(TOK.TOKassign);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3688 arg = new Parameter(STC.STCundefined, at, ai, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3689 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3690
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3691 // Check for " ident;"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3692 else if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3693 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3694 Token *tt = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3695 if (tt.value == TOK.TOKcomma || tt.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3696 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
3697 arg = new Parameter(STC.STCundefined, null, token.ident, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3698 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3699 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3700 if (1 || !global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3701 error("if (v; e) is deprecated, use if (auto v = e)");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3702 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3703 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3704
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3705 condition2 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3706 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3707 ifbody2 = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3708 if (token.value == TOK.TOKelse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3709 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3710 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3711 elsebody2 = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3712 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3713 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3714 elsebody2 = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3715 s = new IfStatement(loc, arg, condition2, ifbody2, elsebody2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3716 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3717 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3718
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3719 case TOK.TOKscope:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3720 if (peek(&token).value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3721 goto Ldeclaration; // scope used as storage class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3722 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3723 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3724 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3725 { error("scope identifier expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3726 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3727 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3728 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3729 { TOK tt = TOK.TOKon_scope_exit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3730 Identifier id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3731
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3732 if (id == Id.exit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3733 tt = TOK.TOKon_scope_exit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3734 else if (id == Id.failure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3735 tt = TOK.TOKon_scope_failure;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3736 else if (id == Id.success)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3737 tt = TOK.TOKon_scope_success;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3738 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3739 error("valid scope identifiers are exit, failure, or success, not %s", id.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3740 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3741 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3742 Statement st = parseStatement(ParseStatementFlags.PScurlyscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3743 s = new OnScopeStatement(loc, tt, st);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3744 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3745 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3746
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3747 case TOK.TOKdebug:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3748 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3749 condition = parseDebugCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3750 goto Lcondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3751
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3752 case TOK.TOKversion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3753 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3754 condition = parseVersionCondition();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3755 goto Lcondition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3756
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3757 Lcondition:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3758 ifbody = parseStatement(cast(ParseStatementFlags)0 /*ParseStatementFlags.PSsemi*/);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3759 elsebody = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3760 if (token.value == TOK.TOKelse)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3761 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3762 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3763 elsebody = parseStatement(cast(ParseStatementFlags)0 /*ParseStatementFlags.PSsemi*/);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3764 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3765 s = new ConditionalStatement(loc, condition, ifbody, elsebody);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3766 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3767
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3768 case TOK.TOKpragma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3769 { Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3770 Expressions args = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3771 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3772
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3773 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3774 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3775 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3776 { error("pragma(identifier expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3777 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3778 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3779 ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3780 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3781 if (token.value == TOK.TOKcomma && peekNext() != TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3782 args = parseArguments(); // pragma(identifier, args...);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3783 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3784 check(TOK.TOKrparen); // pragma(identifier);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3785 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3786 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3787 body_ = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3788 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3789 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3790 body_ = parseStatement(ParseStatementFlags.PSsemi);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3791 s = new PragmaStatement(loc, ident, args, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3792 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3793 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3794
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3795 case TOK.TOKswitch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3796 isfinal = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3797 goto Lswitch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3798
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3799 Lswitch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3800 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3801 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3802 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3803 Expression condition2 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3804 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3805 Statement body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3806 s = new SwitchStatement(loc, condition2, body_, isfinal);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3807 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3808 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3809
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3810 case TOK.TOKcase:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3811 { Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3812 Statements statements;
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
3813 scope cases = new Expressions(); // array of Expression's
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3814 Expression last = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3815
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3816 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3817 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3818 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3819 exp = parseAssignExp();
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
3820 cases.push(exp);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3821 if (token.value != TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3822 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3823 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3824 check(TOK.TOKcolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3825
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3826 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3827 /* case exp: .. case last:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3828 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3829 if (token.value == TOK.TOKslice)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3830 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3831 if (cases.dim > 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3832 error("only one case allowed for start of case range");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3833 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3834 check(TOK.TOKcase);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3835 last = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3836 check(TOK.TOKcolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3837 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3838 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3839
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3840 statements = new Statements();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3841 while (token.value != TOK.TOKcase &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3842 token.value != TOK.TOKdefault &&
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3843 token.value != TOKeof &&
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3844 token.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3845 {
122
c77e9f4f1793 Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
3846 statements.push(parseStatement(ParseStatementFlags.PSsemi | ParseStatementFlags.PScurlyscope));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3847 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3848 s = new CompoundStatement(loc, statements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3849 s = new ScopeStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3850
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3851 ///version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3852 if (last)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3853 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3854 s = new CaseRangeStatement(loc, exp, last, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3855 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3856 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3857 ///}
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3858 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3859 // Keep cases in order by building the case statements backwards
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3860 for (int i = cases.dim; i; i--)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3861 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
3862 exp = cases[i - 1];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3863 s = new CaseStatement(loc, exp, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3864 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3865 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3866 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3867 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3868
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3869 case TOK.TOKdefault:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3870 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3871 Statements statements;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3872
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3873 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3874 check(TOK.TOKcolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3875
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3876 statements = new Statements();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3877 while (token.value != TOK.TOKcase &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3878 token.value != TOK.TOKdefault &&
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
3879 token.value != TOKeof &&
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3880 token.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3881 {
122
c77e9f4f1793 Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
3882 statements.push(parseStatement(ParseStatementFlags.PSsemi | ParseStatementFlags.PScurlyscope));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3883 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3884 s = new CompoundStatement(loc, statements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3885 s = new ScopeStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3886 s = new DefaultStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3887 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3888 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3889
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3890 case TOK.TOKreturn:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3891 { Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3892
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3893 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3894 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3895 exp = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3896 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3897 exp = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3898 check(TOK.TOKsemicolon, "return statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3899 s = new ReturnStatement(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3900 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3901 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3902
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3903 case TOK.TOKbreak:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3904 { Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3905
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3906 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3907 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3908 { ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3909 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3910 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3911 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3912 ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3913 check(TOK.TOKsemicolon, "break statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3914 s = new BreakStatement(loc, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3915 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3916 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3917
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3918 case TOK.TOKcontinue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3919 { Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3920
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3921 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3922 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3923 { ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3924 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3925 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3926 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3927 ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3928 check(TOK.TOKsemicolon, "continue statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3929 s = new ContinueStatement(loc, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3930 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3931 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3932
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3933 case TOK.TOKgoto:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3934 { Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3935
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3936 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3937 if (token.value == TOK.TOKdefault)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3938 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3939 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3940 s = new GotoDefaultStatement(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3941 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3942 else if (token.value == TOK.TOKcase)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3943 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3944 Expression exp = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3945
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3946 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3947 if (token.value != TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3948 exp = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3949 s = new GotoCaseStatement(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3950 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3951 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3952 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3953 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3954 { error("Identifier expected following goto");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3955 ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3956 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3957 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3958 { ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3959 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3960 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3961 s = new GotoStatement(loc, ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3962 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3963 check(TOK.TOKsemicolon, "goto statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3964 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3965 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3966
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3967 case TOK.TOKsynchronized:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3968 { Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3969 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3970
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3971 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3972 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3973 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3974 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3975 exp = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3976 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3977 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3978 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3979 exp = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3980 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3981 s = new SynchronizedStatement(loc, exp, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3982 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3983 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3984
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3985 case TOK.TOKwith:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3986 { Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3987 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3988
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3989 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3990 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3991 exp = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3992 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3993 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3994 s = new WithStatement(loc, exp, body_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3995 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3996 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3997
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3998 case TOK.TOKtry:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3999 { Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4000 Array catches = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4001 Statement finalbody = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4002
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4003 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4004 body_ = parseStatement(ParseStatementFlags.PSscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4005 while (token.value == TOK.TOKcatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4006 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4007 Statement handler;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4008 Catch c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4009 Type tt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4010 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4011 Loc loc2 = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4012
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4013 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4014 if (token.value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4015 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4016 tt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4017 id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4018 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4019 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4020 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4021 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4022 id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4023 tt = parseType(&id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4024 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4026 handler = parseStatement(cast(ParseStatementFlags)0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4027 c = new Catch(loc2, tt, id, handler);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4028 if (!catches)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4029 catches = new Array();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4030 catches.push(cast(void*)c);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4031 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4032
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4033 if (token.value == TOK.TOKfinally)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4034 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4035 finalbody = parseStatement(cast(ParseStatementFlags)0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4036 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4037
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4038 s = body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4039 if (!catches && !finalbody)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4040 error("catch or finally expected following try");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4041 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4042 { if (catches)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4043 s = new TryCatchStatement(loc, body_, catches);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4044 if (finalbody)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4045 s = new TryFinallyStatement(loc, s, finalbody);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4046 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4047 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4048 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4049
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4050 case TOK.TOKthrow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4051 { Expression exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4052
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4053 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4054 exp = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4055 check(TOK.TOKsemicolon, "throw statement");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4056 s = new ThrowStatement(loc, exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4057 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4058 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4059
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4060 case TOK.TOKvolatile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4061 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4062 s = parseStatement(ParseStatementFlags.PSsemi | ParseStatementFlags.PScurlyscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4063 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4064 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4065 error("volatile statements deprecated; used synchronized statements instead");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4066 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4067 s = new VolatileStatement(loc, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4068 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4069
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4070 case TOK.TOKasm:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4071 { Statements statements;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4072 Identifier label;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4073 Loc labelloc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4074 Token* toklist;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4075 Token** ptoklist;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4076
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4077 // Parse the asm block into a sequence of AsmStatements,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4078 // each AsmStatement is one instruction.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4079 // Separate out labels.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4080 // Defer parsing of AsmStatements until semantic processing.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4081
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4082 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4083 check(TOK.TOKlcurly);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4084 toklist = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4085 ptoklist = &toklist;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4086 label = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4087 statements = new Statements();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4088 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4089 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4090 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4091 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4092 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4093 if (!toklist)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4094 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4095 // Look ahead to see if it is a label
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4096 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4097 if (t.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4098 { // It's a label
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4099 label = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4100 labelloc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4101 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4102 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4103 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4104 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4105 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4106 goto Ldefault;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4107
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4108 case TOK.TOKrcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4109 if (toklist || label)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4110 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4111 error("asm statements must end in ';'");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4112 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4113 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4115 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4116 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4117 if (toklist || label)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4118 { // Create AsmStatement from list of tokens we've saved
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4119 s = new AsmStatement(this.loc, toklist);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4120 toklist = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4121 ptoklist = &toklist;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4122 if (label)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4123 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4124 s = new LabelStatement(labelloc, label, s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4125 label = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4126 }
122
c77e9f4f1793 Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
4127 statements.push(s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4128 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4129 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4130 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4131
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4132 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4133 /* { */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4134 error("matching '}' expected, not end of file");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4135 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4137 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4138 Ldefault:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4139 *ptoklist = new Token();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4140 memcpy(*ptoklist, &token, Token.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4141 ptoklist = &(*ptoklist).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4142 *ptoklist = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4143
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4144 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4145 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4146 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4147 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4148 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4149 s = new CompoundStatement(loc, statements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4150 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4151 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4152 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4154 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4155 error("found '%s' instead of statement", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4156 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4157
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4158 Lerror:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4159 while (token.value != TOK.TOKrcurly &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4160 token.value != TOK.TOKsemicolon &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4161 token.value != TOK.TOKeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4162 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4163 if (token.value == TOK.TOKsemicolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4164 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4165 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4166 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4167 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4168
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4169 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4172 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4173 * Parse initializer for variable declaration.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4174 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4175 Initializer parseInitializer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4176 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4177 StructInitializer is_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4178 ArrayInitializer ia;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4179 ExpInitializer ie;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4180 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4181 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4182 Initializer value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4183 int comma;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4184 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4185 Token* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4186 int braces;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4187 int brackets;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4189 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4190 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4191 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4192 /* Scan ahead to see if it is a struct initializer or
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4193 * a function literal.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4194 * If it contains a ';', it is a function literal.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4195 * Treat { } as a struct initializer.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4196 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4197 braces = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4198 for (t = peek(&token); 1; t = peek(t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4199 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4200 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4201 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4202 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4203 case TOK.TOKreturn:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4204 goto Lexpression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4206 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4207 braces++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4208 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4209
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4210 case TOK.TOKrcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4211 if (--braces == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4212 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4213 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4214
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4215 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4216 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4217
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4218 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4219 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4220 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4221 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4222 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4223
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4224 is_ = new StructInitializer(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4225 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4226 comma = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4227 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4228 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4229 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4230 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4231 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4232 if (comma == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4233 error("comma expected separating field initializers");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4234 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4235 if (t.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4236 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4237 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4238 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4239 nextToken(); // skip over ':'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4240 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4241 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4242 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4243 id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4244 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4245 value = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4246 is_.addInit(id, value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4247 comma = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4248 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4249
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4250 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4251 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4252 comma = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4253 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4254
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4255 case TOK.TOKrcurly: // allow trailing comma's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4256 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4257 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4258
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4259 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4260 error("found EOF instead of initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4261 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4263 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4264 value = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4265 is_.addInit(null, value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4266 comma = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4267 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4268 //error("found '%s' instead of field initializer", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4269 //break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4270 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4271 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4273 return is_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4274
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4275 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4276 /* Scan ahead to see if it is an array initializer or
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4277 * an expression.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4278 * If it ends with a ';' ',' or '}', it is an array initializer.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4279 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4280 brackets = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4281 for (t = peek(&token); 1; t = peek(t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4282 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4283 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4284 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4285 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4286 brackets++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4287 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4288
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4289 case TOK.TOKrbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4290 if (--brackets == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4291 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4292 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4293 if (t.value != TOK.TOKsemicolon &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4294 t.value != TOK.TOKcomma &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4295 t.value != TOK.TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4296 goto Lexpression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4297 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4298 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4299 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4300
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4301 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4302 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4303
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4304 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4305 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4306 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4307 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4308 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4309
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4310 ia = new ArrayInitializer(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4311 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4312 comma = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4313 while (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4314 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4315 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4316 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4317 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4318 if (comma == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4319 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4320 error("comma expected separating array initializers, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4321 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4322 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4323 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4324 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4325 if (!e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4326 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4327 if (token.value == TOK.TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4329 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4330 value = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4331 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4332 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4333 { value = new ExpInitializer(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4334 e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4335 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4336 ia.addInit(e, value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4337 comma = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4338 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4339
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4340 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4341 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4342 if (comma == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4343 error("comma expected separating array initializers, not %s", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4344 value = parseInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4345 ia.addInit(null, value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4346 comma = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4347 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4349 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4350 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4351 comma = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4352 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4354 case TOK.TOKrbracket: // allow trailing comma's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4355 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4356 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4357
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4358 case TOK.TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4359 error("found '%s' instead of array initializer", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4360 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4361 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4362 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4363 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4364 return ia;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4365
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4366 case TOK.TOKvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4367 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4368 if (t.value == TOK.TOKsemicolon || t.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4369 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4370 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4371 return new VoidInitializer(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4372 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4373 goto Lexpression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4374
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4375 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4376 Lexpression:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4377 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4378 ie = new ExpInitializer(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4379 return ie;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4380 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4381 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4382
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4383 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4384 * Parses default argument initializer expression that is an assign expression,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4385 * with special handling for __FILE__ and __LINE__.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4386 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4387 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4388 Expression parseDefaultInitExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4389 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4390 if (token.value == TOK.TOKfile ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4391 token.value == TOK.TOKline)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4392 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4393 Token* t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4394 if (t.value == TOK.TOKcomma || t.value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4395 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4396 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4397
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4398 if (token.value == TOK.TOKfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4399 e = new FileInitExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4400 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4401 e = new LineInitExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4402 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4403 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4404 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4405 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4406
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4407 Expression e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4408 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4409 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4410 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4411 void check(Loc loc, TOK value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4412 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4413 if (token.value != value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4414 error(loc, "found '%s' when expecting '%s'", token.toChars(), Token.toChars(value));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4415 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4416 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4417
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4418 void check(TOK value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4419 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4420 check(loc, value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4421 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4422
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4423 void check(TOK value, string string_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4424 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4425 if (token.value != value) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4426 error("found '%s' when expecting '%s' following '%s'", token.toChars(), Token.toChars(value), string_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4427 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4428 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4429 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4430
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4431 /************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4432 * Determine if the scanner is sitting on the start of a declaration.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4433 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4434 * needId 0 no identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4435 * 1 identifier optional
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4436 * 2 must have identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4437 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4438 * if *pt is not null, it is set to the ending token, which would be endtok
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4439 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4440
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4441 bool isDeclaration(Token* t, int needId, TOK endtok, Token** pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4442 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4443 //printf("isDeclaration(needId = %d)\n", needId);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4444 int haveId = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4445
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4446 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4447 if ((t.value == TOK.TOKconst ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4448 t.value == TOK.TOKinvariant ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4449 t.value == TOK.TOKimmutable ||
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4450 t.value == TOKwild ||
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4451 t.value == TOK.TOKshared) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4452 peek(t).value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4453 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4454 /* const type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4455 * immutable type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4456 * shared type
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4457 * wild type
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4458 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4459 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4460 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4461 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4462
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4463 if (!isBasicType(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4464 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4465 goto Lisnot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4466 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4467 if (!isDeclarator(&t, &haveId, endtok))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4468 goto Lisnot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4469 if ( needId == 1 ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4470 (needId == 0 && !haveId) ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4471 (needId == 2 && haveId))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4472 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4473 if (pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4474 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4475 goto Lis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4476 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4477 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4478 goto Lisnot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4479
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4480 Lis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4481 //printf("\tis declaration, t = %s\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4482 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4483
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4484 Lisnot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4485 //printf("\tis not declaration\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4486 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4487 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4488
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4489 bool isBasicType(Token** pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4490 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4491 // This code parallels parseBasicType()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4492 Token* t = *pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4493 Token* t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4494 int parens;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4495 int haveId = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4496
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4497 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4498 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4499 case TOKwchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4500 case TOKdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4501 case TOKbit:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4502 case TOKbool:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4503 case TOKchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4504 case TOKint8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4505 case TOKuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4506 case TOKint16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4507 case TOKuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4508 case TOKint32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4509 case TOKuns32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4510 case TOKint64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4511 case TOKuns64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4512 case TOKfloat32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4513 case TOKfloat64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4514 case TOKfloat80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4515 case TOKimaginary32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4516 case TOKimaginary64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4517 case TOKimaginary80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4518 case TOKcomplex32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4519 case TOKcomplex64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4520 case TOKcomplex80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4521 case TOKvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4522 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4523 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4524
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4525 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4526 L5:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4527 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4528 if (t.value == TOK.TOKnot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4529 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4530 goto L4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4531 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4532 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4533 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4534 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4535 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4536 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4537 L3:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4538 if (t.value == TOK.TOKdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4539 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4540 Ldot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4541 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4542 if (t.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4543 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4544 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4545 if (t.value != TOK.TOKnot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4546 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4547 L4:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4548 /* Seen a !
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4549 * Look for:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4550 * !( args ), !identifier, etc.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4551 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4552 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4553 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4554 { case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4555 goto L5;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4556 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4557 if (!skipParens(t, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4558 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4559 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4560 case TOK.TOKwchar: case TOK.TOKdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4561 case TOK.TOKbit: case TOK.TOKbool: case TOK.TOKchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4562 case TOK.TOKint8: case TOK.TOKuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4563 case TOK.TOKint16: case TOK.TOKuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4564 case TOK.TOKint32: case TOK.TOKuns32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4565 case TOK.TOKint64: case TOK.TOKuns64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4566 case TOK.TOKfloat32: case TOK.TOKfloat64: case TOK.TOKfloat80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4567 case TOK.TOKimaginary32: case TOK.TOKimaginary64: case TOK.TOKimaginary80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4568 case TOK.TOKcomplex32: case TOK.TOKcomplex64: case TOK.TOKcomplex80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4569 case TOK.TOKvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4570 case TOK.TOKint32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4571 case TOK.TOKuns32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4572 case TOK.TOKint64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4573 case TOK.TOKuns64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4574 case TOK.TOKfloat32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4575 case TOK.TOKfloat64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4576 case TOK.TOKfloat80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4577 case TOK.TOKimaginary32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4578 case TOK.TOKimaginary64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4579 case TOK.TOKimaginary80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4580 case TOK.TOKnull:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4581 case TOK.TOKtrue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4582 case TOK.TOKfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4583 case TOK.TOKcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4584 case TOK.TOKwcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4585 case TOK.TOKdcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4586 case TOK.TOKstring:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4587 case TOK.TOKfile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4588 case TOK.TOKline:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4589 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4590 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4591 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4592 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4593 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4594 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4595 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4596 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4597 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4598
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4599 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4600 goto Ldot;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4601
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4602 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4603 /* typeof(exp).identifier...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4604 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4605 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4606 if (t.value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4607 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4608 if (!skipParens(t, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4609 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4610 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4611
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4612 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4613 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4614 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4615 case TOK.TOKshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4616 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4617 // const(type) or immutable(type) or shared(type) or wild(type)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4618 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4619 if (t.value != TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4620 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4621 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4622 if (!isDeclaration(t, 0, TOK.TOKrparen, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4623 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4624 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4625 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4626 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4627 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4628
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4629 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4630 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4631 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4632 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4633 //printf("is\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4634 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4636 Lfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4637 //printf("is not\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4638 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4639 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4640
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4641 bool isDeclarator(Token** pt, int* haveId, TOK endtok)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4642 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4643 // This code parallels parseDeclarator()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4644 Token* t = *pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4645 bool parens;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4646
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4647 //printf("Parser.isDeclarator()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4648 //t.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4649 if (t.value == TOK.TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4650 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4651
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4652 while (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4653 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4654 parens = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4655 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4656 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4657 case TOK.TOKmul:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4658 //case TOKand:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4659 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4660 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4661
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4662 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4663 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4664 if (t.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4665 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4666 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4667 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4668 else if (t.value == TOKnew && peek(t).value == TOKrbracket)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4669 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4670 t = peek(t);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4671 t = peek(t);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4672 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4673 else if (isDeclaration(t, 0, TOK.TOKrbracket, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4674 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4675 // It's an associative array declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4676 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4677 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4678 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4679 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4680 // [ expression ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4681 // [ expression .. expression ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4682 if (!isExpression(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4683 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4684 if (t.value == TOK.TOKslice)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4685 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4686 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4687 if (!isExpression(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4688 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4689 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4690 if (t.value != TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4691 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4692 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4693 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4694 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4695
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4696 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4697 if (*haveId)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4698 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4699 *haveId = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4700 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4701 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4702
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4703 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4704 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4705
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4706 if (t.value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4707 return false; // () is not a declarator
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4708
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4709 /* Regard ( identifier ) as not a declarator
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4710 * BUG: what about ( *identifier ) in
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4711 * f(*p)(x);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4712 * where f is a class instance with overloaded () ?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4713 * Should we just disallow C-style function pointer declarations?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4714 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4715 if (t.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4716 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4717 Token *t2 = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4718 if (t2.value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4719 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4720 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4721
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4722 if (!isDeclarator(&t, haveId, TOK.TOKrparen))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4723 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4724 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4725 parens = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4726 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4727
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4728 case TOK.TOKdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4729 case TOK.TOKfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4730 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4731 if (!isParameters(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4732 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4733 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4734 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4735 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4736 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4737 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4738 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4739
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4740 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4741 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4742 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4743 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4744 version (CARRAYDECL) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4745 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4746 parens = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4747 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4748 if (t.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4749 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4750 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4751 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4752 else if (isDeclaration(t, 0, TOKrbracket, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4753 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4754 // It's an associative array declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4755 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4756 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4757 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4758 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4759 // [ expression ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4760 if (!isExpression(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4761 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4762 if (t.value != TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4763 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4764 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4765 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4766 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4767 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4768
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4769 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4770 parens = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4771 if (!isParameters(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4772 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4773 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4774 while (true)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4775 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4776 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4777 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4778 case TOK.TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4779 case TOK.TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4780 case TOK.TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4781 case TOK.TOKshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4782 case TOKwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4783 case TOK.TOKpure:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4784 case TOK.TOKnothrow:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4785 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4786 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4787 case TOK.TOKat:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4788 t = peek(t); // skip '@'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4789 t = peek(t); // skip identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4790 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4791 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4792 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4793 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4794 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4795 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4796 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4797 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4798
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4799 // Valid tokens that follow a declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4800 case TOK.TOKrparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4801 case TOK.TOKrbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4802 case TOK.TOKassign:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4803 case TOK.TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4804 case TOK.TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4805 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4806 case TOK.TOKin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4807 // The !parens is to disallow unnecessary parentheses
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4808 if (!parens && (endtok == TOK.TOKreserved || endtok == t.value))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4809 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4810 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4811 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4812 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4813 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4814
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4815 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4816 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4817 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4818 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4819 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4820
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4821 bool isParameters(Token** pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4822 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4823 // This code parallels parseParameters()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4824 Token* t = *pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4825
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4826 //printf("isParameters()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4827 if (t.value != TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4828 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4829
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4830 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4831 for (;1; t = peek(t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4832 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4833 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4834 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4835 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4836 case TOKrparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4837 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4838
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4839 case TOKdotdotdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4840 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4841 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4842
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4843 version(D1INOUT) {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4844 case TOKinout:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4845 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4846 case TOKin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4847 case TOKout:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4848 case TOKref:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4849 case TOKlazy:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4850 case TOKfinal:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4851 case TOKauto:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4852 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4853
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4854 case TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4855 case TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4856 case TOKimmutable:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4857 case TOKshared:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
4858 case TOKwild:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4859 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4860 if (t.value == TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4861 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4862 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4863 if (!isDeclaration(t, 0, TOKrparen, &t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4864 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4865 t = peek(t); // skip past closing ')'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4866 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4867 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4868 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4869
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4870 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4871 case TOKstatic:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4872 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4873 case TOKauto:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4874 case TOKalias:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4875 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4876 if (t.value == TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4877 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4878 if (t.value == TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4879 { t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4880 if (!isExpression(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4881 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4882 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4883 goto L3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4884 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4885
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4886 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4887 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4888 if (!isBasicType(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4889 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4890 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4891 int tmp = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4892 if (t.value != TOKdotdotdot &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4893 !isDeclarator(&t, &tmp, TOKreserved))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4894 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4895 if (t.value == TOKassign)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4896 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4897 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4898 if (!isExpression(&t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4899 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4900 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4901 if (t.value == TOKdotdotdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4902 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4903 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4904 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4905 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4906 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4907 L3:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4908 if (t.value == TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4909 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4910 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4911 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4912 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4913 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4914 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4915 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4916
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4917 if (t.value != TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4918 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4919
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4920 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4921 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4922 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4923 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4924
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4925 bool isExpression(Token** pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4926 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4927 // This is supposed to determine if something is an expression.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4928 // What it actually does is scan until a closing right bracket
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4929 // is found.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4930
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4931 Token* t = *pt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4932 int brnest = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4933 int panest = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4934 int curlynest = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4935
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4936 for (;; t = peek(t))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4937 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4938 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4939 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4940 case TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4941 brnest++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4942 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4943
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4944 case TOKrbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4945 if (--brnest >= 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4946 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4947 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4948
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4949 case TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4950 panest++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4951 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4952
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4953 case TOKcomma:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4954 if (brnest || panest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4955 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4956 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4957
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4958 case TOKrparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4959 if (--panest >= 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4960 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4961 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4962
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4963 case TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4964 curlynest++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4965 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4966
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4967 case TOKrcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4968 if (--curlynest >= 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4969 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4970 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4971
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4972 case TOKslice:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4973 if (brnest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4974 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4975 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4976
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4977 case TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4978 if (curlynest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4979 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4980 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4981
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4982 case TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4983 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4984
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4985 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4986 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4987 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4988 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4989 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4990
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4991 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4992 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4993 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4994
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4995 int isTemplateInstance(Token t, Token* pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4996 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4997 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4998 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4999
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5000 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5001 * Skip parens, brackets.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5002 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5003 * t is on opening (
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5004 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5005 * *pt is set to closing token, which is ')' on success
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5006 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5007 * !=0 successful
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5008 * 0 some parsing error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5009 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5010 bool skipParens(Token* t, Token** pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5011 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5012 int parens = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5013
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5014 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5015 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5016 switch (t.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5017 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5018 case TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5019 parens++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5020 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5021
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5022 case TOKrparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5023 parens--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5024 if (parens < 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5025 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5026 if (parens == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5027 goto Ldone;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5028 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5029
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5030 case TOKeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5031 case TOKsemicolon:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5032 goto Lfalse;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5033
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5034 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5035 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5036 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5037 t = peek(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5038 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5039
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5040 Ldone:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5041 if (*pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5042 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5043 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5044
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5045 Lfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5046 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5047 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5048
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5049 Expression parseExpression()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5050 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5051 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5052 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5053 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5054
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5055 //printf("Parser.parseExpression() loc = %d\n", loc.linnum);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5056 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5057 while (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5058 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5059 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5060 e2 = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5061 e = new CommaExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5062 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5063 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5064 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5065 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5066
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5067 Expression parsePrimaryExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5068 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5069 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5070 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5071 Identifier id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5072 TOK save;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5073 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5074
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5075 //printf("parsePrimaryExp(): loc = %d\n", loc.linnum);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5076 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5077 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5078 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5079 id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5080 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5081 if (token.value == TOK.TOKnot && peekNext() != TOK.TOKis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5082 { // identifier!(template-argument-list)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5083 TemplateInstance tempinst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5084
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5085 tempinst = new TemplateInstance(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5086 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5087 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5088 // ident!(template_arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5089 tempinst.tiargs = parseTemplateArgumentList();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5090 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5091 // ident!template_argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5092 tempinst.tiargs = parseTemplateArgument();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5093 e = new ScopeExp(loc, tempinst);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5094 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5095 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5096 e = new IdentifierExp(loc, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5097 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5098
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5099 case TOK.TOKdollar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5100 if (!inBrackets)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5101 error("'$' is valid only inside [] of index or slice");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5102 e = new DollarExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5103 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5104 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5106 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5107 // Signal global scope '.' operator with "" identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5108 e = new IdentifierExp(loc, Id.empty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5109 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5110
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5111 case TOK.TOKthis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5112 e = new ThisExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5113 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5114 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5115
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5116 case TOK.TOKsuper:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5117 e = new SuperExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5118 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5119 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5121 case TOK.TOKint32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5122 e = new IntegerExp(loc, token.int32value, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5123 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5124 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5126 case TOK.TOKuns32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5127 e = new IntegerExp(loc, token.uns32value, Type.tuns32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5128 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5129 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5131 case TOK.TOKint64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5132 e = new IntegerExp(loc, token.int64value, Type.tint64);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5133 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5134 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5135
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5136 case TOK.TOKuns64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5137 e = new IntegerExp(loc, token.uns64value, Type.tuns64);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5138 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5139 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5140
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5141 case TOK.TOKfloat32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5142 e = new RealExp(loc, token.float80value, Type.tfloat32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5143 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5144 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5145
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5146 case TOK.TOKfloat64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5147 e = new RealExp(loc, token.float80value, Type.tfloat64);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5148 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5149 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5150
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5151 case TOK.TOKfloat80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5152 e = new RealExp(loc, token.float80value, Type.tfloat80);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5153 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5154 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5155
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5156 case TOK.TOKimaginary32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5157 e = new RealExp(loc, token.float80value, Type.timaginary32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5158 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5159 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5161 case TOK.TOKimaginary64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5162 e = new RealExp(loc, token.float80value, Type.timaginary64);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5163 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5164 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5165
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5166 case TOK.TOKimaginary80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5167 e = new RealExp(loc, token.float80value, Type.timaginary80);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5168 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5169 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5170
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5171 case TOK.TOKnull:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5172 e = new NullExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5173 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5174 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5175
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5176 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5177 case TOK.TOKfile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5178 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5179 string s = loc.filename ? loc.filename : mod.ident.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5180 e = new StringExp(loc, s, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5181 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5182 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5183 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5184
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5185 case TOK.TOKline:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5186 e = new IntegerExp(loc, loc.linnum, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5187 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5188 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5189 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5190
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5191 case TOK.TOKtrue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5192 e = new IntegerExp(loc, 1, Type.tbool);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5193 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5194 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5195
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5196 case TOK.TOKfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5197 e = new IntegerExp(loc, 0, Type.tbool);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5198 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5199 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5201 case TOK.TOKcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5202 e = new IntegerExp(loc, token.uns32value, Type.tchar);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5203 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5204 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5206 case TOK.TOKwcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5207 e = new IntegerExp(loc, token.uns32value, Type.twchar);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5208 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5209 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5210
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5211 case TOK.TOKdcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5212 e = new IntegerExp(loc, token.uns32value, Type.tdchar);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5213 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5214 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5216 case TOK.TOKstring:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5217 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5218 const(char)* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5219 uint len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5220 ubyte postfix;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5221
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5222 // cat adjacent strings
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5223 s = token.ustring;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5224 len = token.len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5225 postfix = token.postfix;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5226 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5227 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5228 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5229 if (token.value == TOK.TOKstring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5230 { uint len1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5231 uint len2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5232 char* s2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5233
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5234 if (token.postfix)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5235 { if (token.postfix != postfix)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5236 error("mismatched string literal postfixes '%c' and '%c'", postfix, token.postfix);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5237 postfix = token.postfix;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5238 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5239
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5240 len1 = len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5241 len2 = token.len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5242 len = len1 + len2;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
5243 s2 = cast(char*)GC.malloc((len + 1) * ubyte.sizeof);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5244 memcpy(s2, s, len1 * ubyte.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5245 memcpy(s2 + len1, token.ustring, (len2 + 1) * ubyte.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5246 s = s2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5248 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5249 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5250 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5251 e = new StringExp(loc, assumeUnique(s[0..len]), postfix);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5252 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5253 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5254
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5255 case TOK.TOKvoid: t = Type.tvoid; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5256 case TOK.TOKint8: t = Type.tint8; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5257 case TOK.TOKuns8: t = Type.tuns8; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5258 case TOK.TOKint16: t = Type.tint16; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5259 case TOK.TOKuns16: t = Type.tuns16; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5260 case TOK.TOKint32: t = Type.tint32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5261 case TOK.TOKuns32: t = Type.tuns32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5262 case TOK.TOKint64: t = Type.tint64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5263 case TOK.TOKuns64: t = Type.tuns64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5264 case TOK.TOKfloat32: t = Type.tfloat32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5265 case TOK.TOKfloat64: t = Type.tfloat64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5266 case TOK.TOKfloat80: t = Type.tfloat80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5267 case TOK.TOKimaginary32: t = Type.timaginary32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5268 case TOK.TOKimaginary64: t = Type.timaginary64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5269 case TOK.TOKimaginary80: t = Type.timaginary80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5270 case TOK.TOKcomplex32: t = Type.tcomplex32; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5271 case TOK.TOKcomplex64: t = Type.tcomplex64; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5272 case TOK.TOKcomplex80: t = Type.tcomplex80; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5273 case TOK.TOKbit: t = Type.tbit; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5274 case TOK.TOKbool: t = Type.tbool; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5275 case TOK.TOKchar: t = Type.tchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5276 case TOK.TOKwchar: t = Type.twchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5277 case TOK.TOKdchar: t = Type.tdchar; goto LabelX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5278 LabelX:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5279 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5280 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5281 check(TOK.TOKdot, t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5282 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5283 { error("found '%s' when expecting identifier following '%s.'", token.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5284 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5285 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5286 e = typeDotIdExp(loc, t, token.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5287 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5288 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5289
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5290 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5291 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5292 t = parseTypeof();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5293 e = new TypeExp(loc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5294 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5295 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5296
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5297 case TOK.TOKtypeid:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5298 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5299 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5300 check(TOK.TOKlparen, "typeid");
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5301 Object o;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
5302 if (isDeclaration(&token, 0, TOKreserved, null))
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5303 { // argument is a type
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5304 o = parseType();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5305 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5306 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5307 { // argument is an expression
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5308 o = parseAssignExp();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5309 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5310 check(TOK.TOKrparen);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5311 e = new TypeidExp(loc, o);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5312 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5313 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5314
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5315 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5316 case TOK.TOKtraits:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5317 { /* __traits(identifier, args...)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5318 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5319 Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5320 Objects args = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5321
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5322 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5323 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5324 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5325 { error("__traits(identifier, args...) expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5326 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5327 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5328 ident = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5329 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5330 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5331 args = parseTemplateArgumentList2(); // __traits(identifier, args...)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5332 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5333 check(TOK.TOKrparen); // __traits(identifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5334
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5335 e = new TraitsExp(loc, ident, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5336 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5337 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5338 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5339
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5340 case TOK.TOKis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5341 { Type targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5342 Identifier ident = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5343 Type tspec = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5344 TOK tok = TOK.TOKreserved;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5345 TOK tok2 = TOK.TOKreserved;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5346 TemplateParameters tpl = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5347 Loc loc2 = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5349 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5350 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5351 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5352 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5353 targ = parseType(&ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5354 if (token.value == TOK.TOKcolon || token.value == TOK.TOKequal)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5356 tok = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5357 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5358 if (tok == TOK.TOKequal &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5359 (token.value == TOK.TOKtypedef ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5360 token.value == TOK.TOKstruct ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5361 token.value == TOK.TOKunion ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5362 token.value == TOK.TOKclass ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5363 token.value == TOK.TOKsuper ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5364 token.value == TOK.TOKenum ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5365 token.value == TOK.TOKinterface ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5366 ///version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5367 token.value == TOK.TOKconst && peek(&token).value == TOK.TOKrparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5368 token.value == TOK.TOKinvariant && peek(&token).value == TOK.TOKrparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5369 token.value == TOK.TOKimmutable && peek(&token).value == TOK.TOKrparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5370 token.value == TOK.TOKshared && peek(&token).value == TOK.TOKrparen ||
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5371 token.value == TOKwild && peek(&token).value == TOKrparen ||
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5372 ///}
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5373 token.value == TOK.TOKfunction ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5374 token.value == TOK.TOKdelegate ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5375 token.value == TOK.TOKreturn))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5376 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5377 tok2 = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5378 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5379 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5380 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5381 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5382 tspec = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5383 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5384 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5385 if (ident && tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5386 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5387 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5388 tpl = parseTemplateParameterList(1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5389 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5390 { tpl = new TemplateParameters();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5391 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5392 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5393 TemplateParameter tp = new TemplateTypeParameter(loc2, ident, null, null);
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
5394 tpl.insert(0, tp);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5395 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5396 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5397 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5398 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5399 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5400 { error("(type identifier : specialization) expected following is");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5401 goto Lerr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5402 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5403 e = new IsExp(loc2, targ, ident, tok, tspec, tok2, tpl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5404 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5405 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5406
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5407 case TOK.TOKassert:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5408 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5409 Expression msg = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5410
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5411 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5412 check(TOK.TOKlparen, "assert");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5413 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5414 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5415 { nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5416 msg = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5417 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5418 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5419 e = new AssertExp(loc, e, msg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5420 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5421 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5422
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5423 case TOK.TOKmixin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5424 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5425 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5426 check(TOK.TOKlparen, "mixin");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5427 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5428 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5429 e = new CompileExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5430 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5431 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5432
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5433 case TOK.TOKimport:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5434 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5435 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5436 check(TOK.TOKlparen, "import");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5437 e = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5438 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5439 e = new FileExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5440 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5441 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5442
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5443 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5444 if (peekPastParen(&token).value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5445 { // (arguments) { statements... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5446 save = TOK.TOKdelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5447 goto case_delegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5448 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5449 // ( expression )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5450 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5451 e = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5452 check(loc, TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5453 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5454
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5455 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5456 { /* Parse array literals and associative array literals:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5457 * [ value, value, value ... ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5458 * [ key:value, key:value, key:value ... ]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5459 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5460 Expressions values = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5461 Expressions keys = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5462
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5463 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5464 if (token.value != TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5465 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5466 while (token.value != TOK.TOKeof)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5467 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5468 Expression e2 = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5469 if (token.value == TOK.TOKcolon && (keys || values.dim == 0))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5470 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5471 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5472 if (!keys)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5473 keys = new Expressions();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
5474 keys.push(e2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5475 e2 = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5476 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5477 else if (keys)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5478 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5479 error("'key:value' expected for associative array literal");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5480 delete keys;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5481 keys = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5482 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
5483 values.push(e2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5484 if (token.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5485 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5486 check(TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5487 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5488 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5489 check(TOK.TOKrbracket);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5490
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5491 if (keys)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5492 e = new AssocArrayLiteralExp(loc, keys, values);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5493 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5494 e = new ArrayLiteralExp(loc, values);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5495 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5496 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5497
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5498 case TOK.TOKlcurly:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5499 // { statements... }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5500 save = TOK.TOKdelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5501 goto case_delegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5502
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5503 case TOK.TOKfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5504 case TOK.TOKdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5505 save = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5506 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5507 case_delegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5508 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5509 /* function type(parameters) { body } pure nothrow
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5510 * delegate type(parameters) { body } pure nothrow
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5511 * (parameters) { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5512 * { body }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5513 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5514 Parameters arguments;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5515 int varargs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5516 FuncLiteralDeclaration fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5517 Type tt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5518 bool isnothrow = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5519 bool ispure = false;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5520 bool isproperty = false;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5521 TRUST trust = TRUSTdefault;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5522
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5523 if (token.value == TOK.TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5524 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5525 tt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5526 varargs = 0;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5527 arguments = new Parameters();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5528 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5529 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5530 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5531 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5532 tt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5533 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5534 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5535 tt = parseBasicType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5536 tt = parseBasicType2(tt); // function return type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5537 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5538 arguments = parseParameters(&varargs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5539 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5540 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5541 if (token.value == TOK.TOKpure)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5542 ispure = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5543 else if (token.value == TOK.TOKnothrow)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5544 isnothrow = true;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5545 else if (token.value == TOKat)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5546 {
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
5547 StorageClass stc = parseAttribute();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5548 switch (cast(uint)(stc >> 32))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5549 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5550 case STCproperty >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5551 isproperty = true;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5552 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5553 case STCsafe >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5554 trust = TRUSTsafe;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5555 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5556 case STCsystem >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5557 trust = TRUSTsystem;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5558 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5559 case STCtrusted >> 32:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5560 trust = TRUSTtrusted;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5561 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5562 case 0:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5563 break;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5564 default:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5565 assert(0);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5566 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5567 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5568 else
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5569 break;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5570 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5571 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5572 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5573
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5574 TypeFunction tf = new TypeFunction(arguments, tt, varargs, linkage);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5575 tf.ispure = ispure;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5576 tf.isnothrow = isnothrow;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5577 tf.isproperty = isproperty;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5578 tf.trust = trust;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5579 fd = new FuncLiteralDeclaration(loc, Loc(0), tf, save, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5580 parseContracts(fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5581 e = new FuncExp(loc, fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5582 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5583 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5584
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5585 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5586 error("expression expected, not '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5587 Lerr:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5588 // Anything for e, as long as it's not null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5589 e = new IntegerExp(loc, 0, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5590 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5591 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5592 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5593 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5594 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5595
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5596 Expression parseUnaryExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5597 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5598 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5599 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5600
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5601 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5602 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5603 case TOK.TOKand:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5604 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5605 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5606 e = new AddrExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5607 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5608
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5609 case TOK.TOKplusplus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5610 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5611 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5612 e = new AddAssignExp(loc, e, new IntegerExp(loc, 1, Type.tint32));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5613 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5614
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5615 case TOK.TOKminusminus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5616 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5617 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5618 e = new MinAssignExp(loc, e, new IntegerExp(loc, 1, Type.tint32));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5619 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5620
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5621 case TOK.TOKmul:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5622 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5623 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5624 e = new PtrExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5625 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5626
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5627 case TOK.TOKmin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5628 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5629 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5630 e = new NegExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5631 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5632
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5633 case TOK.TOKadd:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5634 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5635 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5636 e = new UAddExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5637 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5638
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5639 case TOK.TOKnot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5640 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5641 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5642 e = new NotExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5643 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5644
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5645 case TOK.TOKtilde:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5646 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5647 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5648 e = new ComExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5649 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5650
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5651 case TOK.TOKdelete:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5652 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5653 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5654 e = new DeleteExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5655 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5656
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5657 case TOK.TOKnew:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5658 e = parseNewExp(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5659 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5660
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5661 case TOK.TOKcast: // cast(type) expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5662 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5663 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5664 check(TOK.TOKlparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5665 /* Look for cast(), cast(const), cast(immutable),
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5666 * cast(shared), cast(shared const), cast(wild), cast(shared wild)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5667 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5668 MOD m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5669 if (token.value == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5670 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5671 m = MOD.MODundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5672 goto Lmod1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5673 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5674 else if (token.value == TOK.TOKconst && peekNext() == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5675 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5676 m = MOD.MODconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5677 goto Lmod2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5678 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5679 else if ((token.value == TOK.TOKimmutable || token.value == TOK.TOKinvariant) && peekNext() == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5680 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5681 m = MOD.MODimmutable;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5682 goto Lmod2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5683 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5684 else if (token.value == TOK.TOKshared && peekNext() == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5685 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5686 m = MOD.MODshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5687 goto Lmod2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5688 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5689 else if (token.value == TOKwild && peekNext() == TOK.TOKrparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5690 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5691 m = MODwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5692 goto Lmod2;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5693 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5694 else if (token.value == TOKwild && peekNext() == TOK.TOKshared && peekNext2() == TOK.TOKrparen ||
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5695 token.value == TOK.TOKshared && peekNext() == TOKwild && peekNext2() == TOK.TOKrparen)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5696 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5697 m = MOD.MODshared | MOD.MODwild;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5698 goto Lmod3;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5699 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5700 else if (token.value == TOK.TOKconst && peekNext() == TOK.TOKshared && peekNext2() == TOK.TOKrparen ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5701 token.value == TOK.TOKshared && peekNext() == TOK.TOKconst && peekNext2() == TOK.TOKrparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5702 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5703 m = MOD.MODshared | MOD.MODconst;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5704 Lmod3:
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5705 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5706 Lmod2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5707 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5708 Lmod1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5709 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5710 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5711 e = new CastExp(loc, e, m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5712 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5713 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5714 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5715 Type t = parseType(); // ( type )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5716 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5717 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5718 e = new CastExp(loc, e, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5719 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5720 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5721 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5722
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5723 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5724 { Token *tk;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5725
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5726 tk = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5727 version (CCASTSYNTAX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5728 // If cast
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5729 if (isDeclaration(tk, 0, TOK.TOKrparen, &tk))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5730 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5731 tk = peek(tk); // skip over right parenthesis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5732 switch (tk.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5733 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5734 case TOK.TOKnot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5735 tk = peek(tk);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5736 if (tk.value == TOK.TOKis) // !is
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5737 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5738 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5739 case TOK.TOKplusplus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5740 case TOK.TOKminusminus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5741 case TOK.TOKdelete:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5742 case TOK.TOKnew:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5743 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5744 case TOK.TOKidentifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5745 case TOK.TOKthis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5746 case TOK.TOKsuper:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5747 case TOK.TOKint32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5748 case TOK.TOKuns32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5749 case TOK.TOKint64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5750 case TOK.TOKuns64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5751 case TOK.TOKfloat32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5752 case TOK.TOKfloat64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5753 case TOK.TOKfloat80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5754 case TOK.TOKimaginary32v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5755 case TOK.TOKimaginary64v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5756 case TOK.TOKimaginary80v:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5757 case TOK.TOKnull:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5758 case TOK.TOKtrue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5759 case TOK.TOKfalse:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5760 case TOK.TOKcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5761 case TOK.TOKwcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5762 case TOK.TOKdcharv:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5763 case TOK.TOKstring:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5764 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5765 case TOK.TOKtilde:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5766 case TOK.TOKand:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5767 case TOK.TOKmul:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5768 case TOK.TOKmin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5769 case TOK.TOKadd:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5770 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5771 case TOK.TOKfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5772 case TOK.TOKdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5773 case TOK.TOKtypeof:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5774 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5775 case TOK.TOKfile:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5776 case TOK.TOKline:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5777 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5778 case TOK.TOKwchar: case TOK.TOKdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5779 case TOK.TOKbit: case TOK.TOKbool: case TOK.TOKchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5780 case TOK.TOKint8: case TOK.TOKuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5781 case TOK.TOKint16: case TOK.TOKuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5782 case TOK.TOKint32: case TOK.TOKuns32:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5783 case TOK.TOKint64: case TOK.TOKuns64:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5784 case TOK.TOKfloat32: case TOK.TOKfloat64: case TOK.TOKfloat80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5785 case TOK.TOKimaginary32: case TOK.TOKimaginary64: case TOK.TOKimaginary80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5786 case TOK.TOKcomplex32: case TOK.TOKcomplex64: case TOK.TOKcomplex80:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5787 case TOK.TOKvoid: // (type)int.size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5788 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5789 // (type) una_exp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5790 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5791 Type t = parseType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5792 check(TOK.TOKrparen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5793
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5794 // if .identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5795 if (token.value == TOK.TOKdot)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5796 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5797 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5798 if (token.value != TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5799 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5800 error("Identifier expected following (type).");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5801 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5802 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5803 e = typeDotIdExp(loc, t, token.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5804 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5805 e = parsePostExp(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5806 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5807 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5808 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5809 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5810 e = new CastExp(loc, e, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5811 error("C style cast illegal, use %s", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5812 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5813 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5814 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5815
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5816 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5817 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5818 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5819 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5820 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5821 e = parsePrimaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5822 e = parsePostExp(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5823 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5824 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5825 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5826 e = parsePrimaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5827 e = parsePostExp(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5828 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5829 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5830 assert(e);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5831
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5832 // ^^ is right associative and has higher precedence than the unary operators
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5833 while (token.value == TOK.TOKpow)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5834 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5835 nextToken();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5836 Expression e2 = parseUnaryExp();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5837 e = new PowExp(loc, e, e2);
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5838 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
5839
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5840 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5841 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5842
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5843 Expression parsePostExp(Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5844 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5845 Loc loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5846
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5847 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5848 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5849 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5850 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5851 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5852 case TOK.TOKdot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5853 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5854 if (token.value == TOK.TOKidentifier)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5855 { Identifier id = token.ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5856
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5857 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5858 if (token.value == TOK.TOKnot && peekNext() != TOK.TOKis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5859 { // identifier!(template-argument-list)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5860 TemplateInstance tempinst = new TemplateInstance(loc, id);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5861 Objects tiargs;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5862 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5863 if (token.value == TOK.TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5864 // ident!(template_arguments)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5865 tiargs = parseTemplateArgumentList();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5866 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5867 // ident!template_argument
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5868 tiargs = parseTemplateArgument();
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
5869 e = new DotTemplateInstanceExp(loc, e, id, tiargs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5870 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5871 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5872 e = new DotIdExp(loc, e, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5873 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5874 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5875 else if (token.value == TOK.TOKnew)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5876 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5877 e = parseNewExp(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5878 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5879 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5880 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5881 error("identifier expected following '.', not '%s'", token.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5882 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5883
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5884 case TOK.TOKplusplus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5885 e = new PostExp(TOK.TOKplusplus, loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5886 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5887
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5888 case TOK.TOKminusminus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5889 e = new PostExp(TOK.TOKminusminus, loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5890 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5891
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5892 case TOK.TOKlparen:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5893 e = new CallExp(loc, e, parseArguments());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5894 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5895
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5896 case TOK.TOKlbracket:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5897 { // array dereferences:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5898 // array[index]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5899 // array[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5900 // array[lwr .. upr]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5901 Expression index;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5902 Expression upr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5903
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5904 inBrackets++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5905 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5906 if (token.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5907 { // array[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5908 e = new SliceExp(loc, e, null, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5909 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5910 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5911 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5912 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5913 index = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5914 if (token.value == TOK.TOKslice)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5915 { // array[lwr .. upr]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5916 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5917 upr = parseAssignExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5918 e = new SliceExp(loc, e, index, upr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5919 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5920 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5921 { // array[index, i2, i3, i4, ...]
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
5922 auto arguments = new Expressions();
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
5923 arguments.push(index);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5924 if (token.value == TOK.TOKcomma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5925 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5926 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5927 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5928 { Expression arg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5929
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5930 arg = parseAssignExp();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
5931 arguments.push(arg);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5932 if (token.value == TOK.TOKrbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5933 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5934 check(TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5935 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5936 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5937 e = new ArrayExp(loc, e, arguments);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5938 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5939 check(TOK.TOKrbracket);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5940 inBrackets--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5941 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5942 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5943 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5944
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5945 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5946 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5947 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5948 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5949 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5950
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5951 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5952 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5953
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5954 Expression parseMulExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5955 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5956 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5957 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5958 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5959
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5960 e = parseUnaryExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5961 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5962 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5963 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5964 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5965 case TOK.TOKmul: nextToken(); e2 = parseUnaryExp(); e = new MulExp(loc,e,e2); continue;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5966 case TOK.TOKdiv: nextToken(); e2 = parseUnaryExp(); e = new DivExp(loc,e,e2); continue;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
5967 case TOK.TOKmod: nextToken(); e2 = parseUnaryExp(); e = new ModExp(loc,e,e2); continue;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5968
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5969 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5970 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5971 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5972 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5973 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5974 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5975 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5976
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5977 Expression parseShiftExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5978 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5979 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5980 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5981 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5982
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5983 e = parseAddExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5984 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5985 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5986 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5987 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5988 case TOK.TOKshl: nextToken(); e2 = parseAddExp(); e = new ShlExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5989 case TOK.TOKshr: nextToken(); e2 = parseAddExp(); e = new ShrExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5990 case TOK.TOKushr: nextToken(); e2 = parseAddExp(); e = new UshrExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5991
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5992 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5993 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5994 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5995 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5996 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5997 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5998 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5999
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6000 Expression parseAddExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6001 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6002 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6003 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6004 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6005
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6006 e = parseMulExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6007 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6008 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6009 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6010 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6011 case TOK.TOKadd: nextToken(); e2 = parseMulExp(); e = new AddExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6012 case TOK.TOKmin: nextToken(); e2 = parseMulExp(); e = new MinExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6013 case TOK.TOKtilde: nextToken(); e2 = parseMulExp(); e = new CatExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6014
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6015 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6016 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6017 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6018 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6019 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6020 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6021 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6022
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6023 Expression parseRelExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6024 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6025 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6026 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6027
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6028 Expression parseEqualExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6029 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6030 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6031 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6032
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6033 Expression parseCmpExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6034 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6035 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6036 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6037 Token* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6038 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6039
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6040 e = parseShiftExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6041 TOK op = token.value;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6042
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6043 switch (op)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6044 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6045 case TOK.TOKequal:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6046 case TOK.TOKnotequal:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6047 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6048 e2 = parseShiftExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6049 e = new EqualExp(op, loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6050 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6051
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6052 case TOK.TOKis:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6053 op = TOK.TOKidentity;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6054 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6055
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6056 case TOK.TOKnot:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6057 // Attempt to identify '!is'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6058 t = peek(&token);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6059 if (t.value != TOK.TOKis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6060 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6061 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6062 op = TOK.TOKnotidentity;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6063 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6064
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6065 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6066 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6067 e2 = parseShiftExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6068 e = new IdentityExp(op, loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6069 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6070
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6071 case TOK.TOKlt:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6072 case TOK.TOKle:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6073 case TOK.TOKgt:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6074 case TOK.TOKge:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6075 case TOK.TOKunord:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6076 case TOK.TOKlg:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6077 case TOK.TOKleg:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6078 case TOK.TOKule:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6079 case TOK.TOKul:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6080 case TOK.TOKuge:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6081 case TOK.TOKug:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6082 case TOK.TOKue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6083 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6084 e2 = parseShiftExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6085 e = new CmpExp(op, loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6086 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6087
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6088 case TOK.TOKin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6089 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6090 e2 = parseShiftExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6091 e = new InExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6092 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6093
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6094 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6095 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6096 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6097 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6098 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6099
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6100 Expression parseAndExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6101 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6102 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6103 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6104 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6106 if (global.params.Dversion == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6107 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6108 e = parseEqualExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6109 while (token.value == TOK.TOKand)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6110 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6111 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6112 e2 = parseEqualExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6113 e = new AndExp(loc,e,e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6114 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6115 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6116 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6117 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6118 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6119 e = parseCmpExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6120 while (token.value == TOK.TOKand)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6121 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6122 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6123 e2 = parseCmpExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6124 e = new AndExp(loc,e,e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6125 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6126 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6127 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6128 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6129 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6131 Expression parseXorExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6133 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6134 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6135 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6137 e = parseAndExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6138 while (token.value == TOK.TOKxor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6139 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6140 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6141 e2 = parseAndExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6142 e = new XorExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6143 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6144
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6145 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6146 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6147
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6148 Expression parseOrExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6149 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6150 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6151 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6152 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6154 e = parseXorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6155 while (token.value == TOK.TOKor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6156 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6157 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6158 e2 = parseXorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6159 e = new OrExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6160 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6161 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6164 Expression parseAndAndExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6165 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6166 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6167 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6168 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6169
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6170 e = parseOrExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6171 while (token.value == TOK.TOKandand)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6172 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6173 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6174 e2 = parseOrExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6175 e = new AndAndExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6176 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6177 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6178 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6179
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6180 Expression parseOrOrExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6181 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6182 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6183 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6184 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6185
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6186 e = parseAndAndExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6187 while (token.value == TOK.TOKoror)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6188 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6189 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6190 e2 = parseAndAndExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6191 e = new OrOrExp(loc, e, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6192 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6193
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6194 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6195 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6196
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6197 Expression parseCondExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6198 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6199 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6200 Expression e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6201 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6202 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6203
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6204 e = parseOrOrExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6205 if (token.value == TOK.TOKquestion)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6206 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6207 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6208 e1 = parseExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6209 check(TOK.TOKcolon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6210 e2 = parseCondExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6211 e = new CondExp(loc, e, e1, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6212 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6213 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6214 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6216 Expression parseAssignExp()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6217 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6218 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6219 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6220 Loc loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6221
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6222 e = parseCondExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6223 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6224 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6225 loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6226 switch (token.value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6227 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6228 case TOK.TOKassign: nextToken(); e2 = parseAssignExp(); e = new AssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6229 case TOK.TOKaddass: nextToken(); e2 = parseAssignExp(); e = new AddAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6230 case TOK.TOKminass: nextToken(); e2 = parseAssignExp(); e = new MinAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6231 case TOK.TOKmulass: nextToken(); e2 = parseAssignExp(); e = new MulAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6232 case TOK.TOKdivass: nextToken(); e2 = parseAssignExp(); e = new DivAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6233 case TOK.TOKmodass: nextToken(); e2 = parseAssignExp(); e = new ModAssignExp(loc,e,e2); continue;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 132
diff changeset
6234 case TOK.TOKpowass: nextToken(); e2 = parseAssignExp(); e = new PowAssignExp(loc,e,e2); continue;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6235 case TOK.TOKandass: nextToken(); e2 = parseAssignExp(); e = new AndAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6236 case TOK.TOKorass: nextToken(); e2 = parseAssignExp(); e = new OrAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6237 case TOK.TOKxorass: nextToken(); e2 = parseAssignExp(); e = new XorAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6238 case TOK.TOKshlass: nextToken(); e2 = parseAssignExp(); e = new ShlAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6239 case TOK.TOKshrass: nextToken(); e2 = parseAssignExp(); e = new ShrAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6240 case TOK.TOKushrass: nextToken(); e2 = parseAssignExp(); e = new UshrAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6241 case TOK.TOKcatass: nextToken(); e2 = parseAssignExp(); e = new CatAssignExp(loc,e,e2); continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6242
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6243 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6244 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6245 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6246 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6249 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6250 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6252 /*************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6253 * Collect argument list.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6254 * Assume current token is ',', '(' or '['.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6255 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6256 Expressions parseArguments()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6257 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6258 // function call
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6259 Expressions arguments = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6260 Expression arg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6261 TOK endtok;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6263 if (token.value == TOK.TOKlbracket)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6264 endtok = TOK.TOKrbracket;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6265 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6266 endtok = TOK.TOKrparen;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6267
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6268 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6269 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6270 if (token.value != endtok)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6271 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6272 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6273 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6274 arg = parseAssignExp();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
6275 arguments.push(arg);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6276 if (token.value == endtok)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6277 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6278 check(TOK.TOKcomma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6279 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6280 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6281 check(endtok);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6282 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6283 return arguments;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6285
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6286 Expression parseNewExp(Expression thisexp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6287 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6288 Type t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6289 Expressions newargs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6290 Expressions arguments = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6291 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6292 Loc loc = this.loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6293
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6294 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6295 newargs = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6296 if (token.value == TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6297 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6298 newargs = parseArguments();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6299 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6300
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6301 // An anonymous nested class starts with "class"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6302 if (token.value == TOKclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6303 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6304 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6305 if (token.value == TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6306 arguments = parseArguments();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6307
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6308 BaseClasses baseclasses = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6309 if (token.value != TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6310 baseclasses = parseBaseClasses();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6311
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6312 Identifier id = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6313 ClassDeclaration cd = new ClassDeclaration(loc, id, baseclasses);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6314
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6315 if (token.value != TOKlcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6316 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6317 error("{ members } expected for anonymous class");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6318 cd.members = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6319 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6320 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6322 nextToken();
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 56
diff changeset
6323 auto decl = parseDeclDefs(0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6324 if (token.value != TOKrcurly)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6325 error("class member expected");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6326 nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6327 cd.members = decl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6328 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6329
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6330 e = new NewAnonClassExp(loc, thisexp, newargs, cd, arguments);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6331
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6332 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6333 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6334
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6335 t = parseBasicType();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6336 t = parseBasicType2(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6337 if (t.ty == Taarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6338 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6339 TypeAArray taa = cast(TypeAArray)t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6340 Type index = taa.index;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6341
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6342 Expression e2 = index.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6343 if (e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6344 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6345 arguments = new Expressions();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
6346 arguments.push(e2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6347 t = new TypeDArray(taa.next);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6348 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6349 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6350 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6351 error("need size of rightmost array, not type %s", index.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6352 return new NullExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6353 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6354 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6355 else if (t.ty == Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6356 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6357 TypeSArray tsa = cast(TypeSArray)t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6358 Expression ee = tsa.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6359
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6360 arguments = new Expressions();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
6361 arguments.push(ee);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6362 t = new TypeDArray(tsa.next);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6363 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6364 else if (token.value == TOKlparen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6365 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6366 arguments = parseArguments();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6367 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6368
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6369 e = new NewExp(loc, thisexp, newargs, t, arguments);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6370 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6371 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6372
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
6373 void addComment(Dsymbol s, const(char)[] blockComment)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6374 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6375 s.addComment(combineComments(blockComment, token.lineComment));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6376 token.lineComment = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6377 }
19
01cadcfa4842 Implemented CompileExp, ConditionalDeclaration, ModAssignExp, parsingmixin statements, TemplateAliasParameters, TemplateMixins, TypeDArray.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
6378 }