annotate dmd/parse.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents c61782a76dff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2 // Compiler implementation of the D programming language
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
11 // This is the D parser
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
12
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
13 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
14 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
15
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
16 #include "rmem.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
17 #include "lexer.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
18 #include "parse.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
19 #include "init.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
20 #include "attrib.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
21 #include "cond.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
22 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
23 #include "template.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
24 #include "staticassert.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
25 #include "expression.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
26 #include "statement.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
27 #include "module.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
28 #include "dsymbol.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
29 #include "import.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
30 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
31 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
32 #include "enum.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
33 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
34 #include "version.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
35 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
36 #include "aliasthis.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
37 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
38
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
39 // How multiple declarations are parsed.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
40 // If 1, treat as C.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
41 // If 0, treat:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
42 // int *p, i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
43 // as:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
44 // int* p;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
45 // int* i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
46 #define CDECLSYNTAX 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
47
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
48 // Support C cast syntax:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
49 // (type)(expression)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
50 #define CCASTSYNTAX 1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
51
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
52 // Support postfix C array declarations, such as
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
53 // int a[3][4];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
54 #define CARRAYDECL 1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
55
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
56 // Support left-to-right array declarations
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
57 #define LTORARRAYDECL 1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
58
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
59
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
60 Parser::Parser(Module *module, unsigned char *base, unsigned length, int doDocComment)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
61 : Lexer(module, base, 0, length, doDocComment, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
62 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
63 //printf("Parser::Parser()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
64 md = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
65 linkage = LINKd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
66 endloc = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
67 inBrackets = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
68 //nextToken(); // start up the scanner
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
69 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
70
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
71 Array *Parser::parseModule()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
72 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
73 Array *decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
74
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
75 // ModuleDeclation leads off
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
76 if (token.value == TOKmodule)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
77 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
78 unsigned char *comment = token.blockComment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
79
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
80 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
81 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
82 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
83 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
84 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
85 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
86 { error("module (system) identifier expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
87 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
88 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
89 Identifier *id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
90
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
91 if (id == Id::system)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
92 safe = TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
93 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
94 error("(safe) expected, not %s", id->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
95 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
96 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
97 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
98 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
99
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
100 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
101 { error("Identifier expected following module");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
102 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
103 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
104 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
105 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
106 Array *a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
107 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
108
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
109 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
110 while (nextToken() == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
111 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
112 if (!a)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
113 a = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
114 a->push(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
115 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
116 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
117 { error("Identifier expected following package");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
118 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
119 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
120 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
121 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
122
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
123 md = new ModuleDeclaration(a, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
124
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
125 if (token.value != TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
126 error("';' expected following module declaration instead of %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
127 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
128 addComment(mod, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
129 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
130 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
131
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
132 decldefs = parseDeclDefs(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
133 if (token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
134 { error("unrecognized declaration");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
135 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
136 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
137 return decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
138
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
139 Lerr:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
140 while (token.value != TOKsemicolon && token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
141 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
142 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
143 return new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
144 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
145
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
146 Array *Parser::parseDeclDefs(int once)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
147 { Dsymbol *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
148 Array *decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
149 Array *a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
150 Array *aelse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
151 enum PROT prot;
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
152 StorageClass stc;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
153 Condition *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
154 unsigned char *comment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
155
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
156 //printf("Parser::parseDeclDefs()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
157 decldefs = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
158 do
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
159 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
160 comment = token.blockComment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
161 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
162 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
163 case TOKenum:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
164 s = parseEnum();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
165 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
166
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
167 case TOKstruct:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
168 case TOKunion:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
169 case TOKclass:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
170 case TOKinterface:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
171 s = parseAggregate();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
172 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
173
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
174 case TOKimport:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
175 s = parseImport(decldefs, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
176 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
177
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
178 case TOKtemplate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
179 s = (Dsymbol *)parseTemplateDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
180 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
181
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
182 case TOKmixin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
183 { Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
184 if (peek(&token)->value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
185 { // mixin(string)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
186 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
187 check(TOKlparen, "mixin");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
188 Expression *e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
189 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
190 check(TOKsemicolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
191 s = new CompileDeclaration(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
192 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
193 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
194 s = parseMixin();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
195 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
196 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
197
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
198 case BASIC_TYPES:
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
199 case TOKalias:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
200 case TOKtypedef:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
201 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
202 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
203 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
204 Ldeclaration:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
205 a = parseDeclarations();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
206 decldefs->append(a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
207 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
208
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
209 case TOKthis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
210 s = parseCtor();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
211 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
212
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
213 case TOKtilde:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
214 s = parseDtor();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
215 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
216
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
217 case TOKinvariant:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
218 #if 1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
219 s = parseInvariant();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
220 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
221 if (peek(&token)->value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
222 s = parseInvariant();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
223 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
224 {
1619
c61782a76dff Merge DMD r304: refactor invariant => immutable
Leandro Lucarella <llucax@gmail.com>
parents: 1607
diff changeset
225 stc = STCimmutable;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
226 goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
227 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
228 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
229 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
230
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
231 case TOKunittest:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
232 s = parseUnitTest();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
233 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
234
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
235 case TOKnew:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
236 s = parseNew();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
237 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
238
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
239 case TOKdelete:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
240 s = parseDelete();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
241 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
243 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
244 case TOKrcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
245 return decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
246
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
247 case TOKstatic:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
248 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
249 if (token.value == TOKthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
250 s = parseStaticCtor();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
251 else if (token.value == TOKtilde)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
252 s = parseStaticDtor();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
253 else if (token.value == TOKassert)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
254 s = parseStaticAssert();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
255 else if (token.value == TOKif)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
256 { condition = parseStaticIfCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
257 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
258 aelse = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
259 if (token.value == TOKelse)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
260 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
261 aelse = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
262 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
263 s = new StaticIfDeclaration(condition, a, aelse);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
264 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
265 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
266 else if (token.value == TOKimport)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
267 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
268 s = parseImport(decldefs, 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
269 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
270 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
271 { stc = STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
272 goto Lstc2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
273 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
274 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
275
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
276 case TOKconst: stc = STCconst; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
277 case TOKfinal: stc = STCfinal; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
278 case TOKauto: stc = STCauto; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
279 case TOKscope: stc = STCscope; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
280 case TOKoverride: stc = STCoverride; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
281 case TOKabstract: stc = STCabstract; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
282 case TOKsynchronized: stc = STCsynchronized; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
283 case TOKdeprecated: stc = STCdeprecated; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
284 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
285 case TOKnothrow: stc = STCnothrow; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
286 case TOKpure: stc = STCpure; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
287 case TOKref: stc = STCref; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
288 case TOKtls: stc = STCtls; goto Lstc;
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
289 case TOKgshared: stc = STCgshared; goto Lstc;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
290 //case TOKmanifest: stc = STCmanifest; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
291 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
292
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
293 Lstc:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
294 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
295 Lstc2:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
296 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
297 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
298 case TOKconst: stc |= STCconst; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
299 case TOKfinal: stc |= STCfinal; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
300 case TOKauto: stc |= STCauto; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
301 case TOKscope: stc |= STCscope; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
302 case TOKoverride: stc |= STCoverride; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
303 case TOKabstract: stc |= STCabstract; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
304 case TOKsynchronized: stc |= STCsynchronized; goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
305 case TOKdeprecated: stc |= STCdeprecated; goto Lstc;
1619
c61782a76dff Merge DMD r304: refactor invariant => immutable
Leandro Lucarella <llucax@gmail.com>
parents: 1607
diff changeset
306 //case TOKinvariant: stc |= STCimmutable; goto Lstc;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
307 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
308 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
309 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
310
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
311 /* Look for auto initializers:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
312 * storage_class identifier = initializer;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
313 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
314 if (token.value == TOKidentifier &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
315 peek(&token)->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
316 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
317 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
318 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
319 Identifier *ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
320 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
321 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
322 Initializer *init = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
323 VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
324 v->storage_class = stc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
325 s = v;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
326 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
327 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
328 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
329 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
330 else if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
331 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
332 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
333 if (token.value == TOKidentifier &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
334 peek(&token)->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
335 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
336 decldefs->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
337 addComment(s, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
338 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
339 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
340 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
341 error("Identifier expected following comma");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
342 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
343 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
344 error("semicolon expected following auto declaration, not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
345 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
346 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
347 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
348 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
349 { a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
350 s = new StorageClassDeclaration(stc, a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
351 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
352 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
353
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
354 case TOKextern:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
355 if (peek(&token)->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
356 { stc = STCextern;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
357 goto Lstc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
358 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
359 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
360 enum LINK linksave = linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
361 linkage = parseLinkage();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
362 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
363 s = new LinkDeclaration(linkage, a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
364 linkage = linksave;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
365 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
366 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
367 case TOKprivate: prot = PROTprivate; goto Lprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
368 case TOKpackage: prot = PROTpackage; goto Lprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
369 case TOKprotected: prot = PROTprotected; goto Lprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
370 case TOKpublic: prot = PROTpublic; goto Lprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
371 case TOKexport: prot = PROTexport; goto Lprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
372
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
373 Lprot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
374 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
375 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
376 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
377 case TOKprivate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
378 case TOKpackage:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
379 case TOKprotected:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
380 case TOKpublic:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
381 case TOKexport:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
382 error("redundant protection attribute");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
383 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
384 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
385 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
386 s = new ProtDeclaration(prot, a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
387 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
388
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
389 case TOKalign:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
390 { unsigned n;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
391
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
392 // LDC better align code locations
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
393 Loc alignloc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
394
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
395 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
396 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
397 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
398 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
399 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
400 if (token.value == TOKint32v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
401 n = (unsigned)token.uns64value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
402 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
403 { error("integer expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
404 n = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
405 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
406 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
407 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
408 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
409 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
410 n = global.structalign; // default
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
411
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
412 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
413 s = new AlignDeclaration(alignloc, n, a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
414 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
415 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
416
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
417 case TOKpragma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
418 { Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
419 Expressions *args = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
420
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
421 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
422 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
423 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
424 { error("pragma(identifier expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
425 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
426 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
427 ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
428 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
429 if (token.value == TOKcomma && peekNext() != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
430 args = parseArguments(); // pragma(identifier, args...)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
431 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
432 check(TOKrparen); // pragma(identifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
433
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
434 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
435 a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
436 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
437 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
438 s = new PragmaDeclaration(loc, ident, args, a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
439 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
440 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
441
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
442 case TOKdebug:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
443 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
444 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
445 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
446 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
447 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
448 s = new DebugSymbol(loc, token.ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
449 else if (token.value == TOKint32v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
450 s = new DebugSymbol(loc, (unsigned)token.uns64value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
451 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
452 { error("identifier or integer expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
453 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
454 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
455 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
456 if (token.value != TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
457 error("semicolon expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
458 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
459 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
460 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
461
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
462 condition = parseDebugCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
463 goto Lcondition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
464
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
465 case TOKversion:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
466 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
467 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
468 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
469 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
470 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
471 s = new VersionSymbol(loc, token.ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
472 else if (token.value == TOKint32v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
473 s = new VersionSymbol(loc, (unsigned)token.uns64value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
474 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
475 { error("identifier or integer expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
476 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
477 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
478 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
479 if (token.value != TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
480 error("semicolon expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
481 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
482 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
483 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
484 condition = parseVersionCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
485 goto Lcondition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
486
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
487 Lcondition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
488 a = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
489 aelse = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
490 if (token.value == TOKelse)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
491 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
492 aelse = parseBlock();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
493 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
494 s = new ConditionalDeclaration(condition, a, aelse);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
495 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
496
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
497 case TOKsemicolon: // empty declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
498 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
499 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
500
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
501 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
502 error("Declaration expected, not '%s'",token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
503 Lerror:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
504 while (token.value != TOKsemicolon && token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
505 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
506 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
507 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
508 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
509 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
510 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
511 { decldefs->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
512 addComment(s, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
513 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
514 } while (!once);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
515 return decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
516 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
517
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
518 /*********************************************
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
519 * Give error on conflicting storage classes.
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
520 */
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
521
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
522 #if DMDV2
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
523 void Parser::composeStorageClass(StorageClass stc)
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
524 {
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
525 StorageClass u = stc;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
526 u &= STCconst | STCimmutable | STCmanifest;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
527 if (u & (u - 1))
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
528 error("conflicting storage class %s", Token::toChars(token.value));
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
529 u = stc;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
530 u &= STCgshared | STCshared | STCtls;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
531 if (u & (u - 1))
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
532 error("conflicting storage class %s", Token::toChars(token.value));
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
533 }
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
534 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
535
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
536 /********************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
537 * Parse declarations after an align, protection, or extern decl.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
538 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
539
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
540 Array *Parser::parseBlock()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
541 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
542 Array *a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
543 Dsymbol *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
544
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
545 //printf("parseBlock()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
546 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
547 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
548 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
549 error("declaration expected following attribute, not ';'");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
550 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
551 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
552
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
553 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
554 error("declaration expected following attribute, not EOF");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
555 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
556
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
557 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
558 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
559 a = parseDeclDefs(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
560 if (token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
561 { /* { */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
562 error("matching '}' expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
563 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
564 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
565 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
566 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
567
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
568 case TOKcolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
569 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
570 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
571 a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
572 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
573 a = parseDeclDefs(0); // grab declarations up to closing curly bracket
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
574 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
575 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
576
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
577 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
578 a = parseDeclDefs(1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
579 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
580 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
581 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
582 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
583
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
584 /**********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
585 * Parse a static assertion.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
586 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
588 StaticAssert *Parser::parseStaticAssert()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
589 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
590 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
591 Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
592 Expression *msg = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
593
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
594 //printf("parseStaticAssert()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
595 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
596 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
597 exp = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
598 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
599 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
600 msg = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
601 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
602 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
603 check(TOKsemicolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
604 return new StaticAssert(loc, exp, msg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
605 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
606
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
607 /***********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
608 * Parse typeof(expression).
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
609 * Current token is on the 'typeof'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
610 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
611
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
612 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
613 TypeQualified *Parser::parseTypeof()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
614 { TypeQualified *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
615 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
616
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
617 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
618 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
619 if (token.value == TOKreturn) // typeof(return)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
620 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
621 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
622 t = new TypeReturn(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
623 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
624 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
625 { Expression *exp = parseExpression(); // typeof(expression)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
626 t = new TypeTypeof(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
627 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
628 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
629 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
630 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
631 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
632
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
633 /***********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
634 * Parse extern (linkage)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
635 * The parser is on the 'extern' token.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
636 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
637
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
638 enum LINK Parser::parseLinkage()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
639 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
640 enum LINK link = LINKdefault;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
641 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
642 assert(token.value == TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
643 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
644 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
645 { Identifier *id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
646
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
647 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
648 if (id == Id::Windows)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
649 link = LINKwindows;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
650 else if (id == Id::Pascal)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
651 link = LINKpascal;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
652 else if (id == Id::D)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
653 link = LINKd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
654 else if (id == Id::C)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
655 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
656 link = LINKc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
657 if (token.value == TOKplusplus)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
658 { link = LINKcpp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
659 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
660 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
661 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
662 else if (id == Id::System)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
663 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
664 // LDC we configure target at runtime
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
665 if (global.params.os == OSWindows)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
666 link = LINKwindows;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
667 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
668 link = LINKc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
669 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
670 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
671 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
672 error("valid linkage identifiers are D, C, C++, Pascal, Windows, System");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
673 link = LINKd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
674 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
675 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
676 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
677 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
678 link = LINKd; // default
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
679 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
680 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
681 return link;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
682 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
683
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
684 /**************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
685 * Parse a debug conditional
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
686 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
687
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
688 Condition *Parser::parseDebugCondition()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
689 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
690 Condition *c;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
691
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
692 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
693 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
694 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
695 unsigned level = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
696 Identifier *id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
697
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
698 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
699 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
700 else if (token.value == TOKint32v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
701 level = (unsigned)token.uns64value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
702 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
703 error("identifier or integer expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
704 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
705 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
706 c = new DebugCondition(mod, level, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
707 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
708 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
709 c = new DebugCondition(mod, 1, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
710 return c;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
711
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
712 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
713
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
714 /**************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
715 * Parse a version conditional
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
716 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
717
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
718 Condition *Parser::parseVersionCondition()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
719 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
720 Condition *c;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
721 unsigned level = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
722 Identifier *id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
723
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
724 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
725 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
726 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
727 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
728 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
729 else if (token.value == TOKint32v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
730 level = (unsigned)token.uns64value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
731 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
732 /* Allow:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
733 * version (unittest)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
734 * even though unittest is a keyword
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
735 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
736 else if (token.value == TOKunittest)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
737 id = Lexer::idPool(Token::toChars(TOKunittest));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
738 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
739 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
740 error("identifier or integer expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
741 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
742 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
743
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
744 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
745 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
746 error("(condition) expected following version");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
747 c = new VersionCondition(mod, level, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
748 return c;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
749
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
750 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
751
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
752 /***********************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
753 * static if (expression)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
754 * body
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
755 * else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
756 * body
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
757 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
758
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
759 Condition *Parser::parseStaticIfCondition()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
760 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
761 Condition *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
762 Array *aif;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
763 Array *aelse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
764 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
765
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
766 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
767 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
768 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
769 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
770 exp = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
771 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
772 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
773 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
774 { error("(expression) expected following static if");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
775 exp = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
776 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
777 condition = new StaticIfCondition(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
778 return condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
779 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
780
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
781
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
782 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
783 * Parse a constructor definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
784 * this(arguments) { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
785 * Current token is 'this'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
786 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
787
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
788 Dsymbol *Parser::parseCtor()
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
789 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
790 CtorDeclaration *f;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
791 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
792 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
793 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
794
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
795 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
796 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
797 f = new CtorDeclaration(loc, 0, arguments, varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
798 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
799 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
800 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
801
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
802 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
803 * Parse a destructor definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
804 * ~this() { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
805 * Current token is '~'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
806 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
807
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
808 DtorDeclaration *Parser::parseDtor()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
809 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
810 DtorDeclaration *f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
811 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
812
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
813 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
814 check(TOKthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
815 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
816 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
817
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
818 f = new DtorDeclaration(loc, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
819 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
820 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
821 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
822
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
823 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
824 * Parse a static constructor definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
825 * static this() { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
826 * Current token is 'this'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
827 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
828
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
829 StaticCtorDeclaration *Parser::parseStaticCtor()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
830 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
831 StaticCtorDeclaration *f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
832 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
833
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
834 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
835 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
836 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
837
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
838 f = new StaticCtorDeclaration(loc, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
839 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
840 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
841 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
842
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
843 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
844 * Parse a static destructor definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
845 * static ~this() { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
846 * Current token is '~'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
847 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
848
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
849 StaticDtorDeclaration *Parser::parseStaticDtor()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
850 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
851 StaticDtorDeclaration *f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
852 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
853
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
854 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
855 check(TOKthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
856 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
857 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
858
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
859 f = new StaticDtorDeclaration(loc, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
860 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
861 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
862 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
863
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
864 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
865 * Parse an invariant definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
866 * invariant() { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
867 * Current token is 'invariant'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
868 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
869
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
870 InvariantDeclaration *Parser::parseInvariant()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
871 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
872 InvariantDeclaration *f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
873 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
874
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
875 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
876 if (token.value == TOKlparen) // optional ()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
877 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
878 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
879 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
880 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
881
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
882 f = new InvariantDeclaration(loc, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
883 f->fbody = parseStatement(PScurly);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
884 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
885 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
886
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
887 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
888 * Parse a unittest definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
889 * unittest { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
890 * Current token is 'unittest'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
891 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
892
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
893 UnitTestDeclaration *Parser::parseUnitTest()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
894 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
895 UnitTestDeclaration *f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
896 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
897 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
898
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
899 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
900
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
901 body = parseStatement(PScurly);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
902
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
903 f = new UnitTestDeclaration(loc, this->loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
904 f->fbody = body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
905 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
906 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
907
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
908 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
909 * Parse a new definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
910 * new(arguments) { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
911 * Current token is 'new'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
912 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
913
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
914 NewDeclaration *Parser::parseNew()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
915 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
916 NewDeclaration *f;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
917 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
918 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
919 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
920
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
921 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
922 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
923 f = new NewDeclaration(loc, 0, arguments, varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
924 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
925 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
926 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
927
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
928 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
929 * Parse a delete definition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
930 * delete(arguments) { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
931 * Current token is 'delete'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
932 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
933
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
934 DeleteDeclaration *Parser::parseDelete()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
935 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
936 DeleteDeclaration *f;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
937 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
938 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
939 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
940
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
941 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
942 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
943 if (varargs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
944 error("... not allowed in delete function parameter list");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
945 f = new DeleteDeclaration(loc, 0, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
946 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
947 return f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
948 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
949
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
950 /**********************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
951 * Parse parameter list.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
952 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
953
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
954 Parameters *Parser::parseParameters(int *pvarargs)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
955 {
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
956 Parameters *arguments = new Parameters();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
957 int varargs = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
958 int hasdefault = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
959
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
960 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
961 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
962 { Type *tb;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
963 Identifier *ai = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
964 Type *at;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
965 Parameter *a;
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
966 StorageClass storageClass = 0;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
967 Expression *ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
968
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
969 storageClass = STCin; // parameter is "in" by default
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
970 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
971 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
972 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
973 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
974
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
975 case TOKdotdotdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
976 varargs = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
977 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
978 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
979
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
980 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
981 storageClass = STCin;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
982 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
983 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
984
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
985 case TOKout:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
986 storageClass = STCout;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
987 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
988 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
989
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
990 case TOKinout:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
991 case TOKref:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
992 storageClass = STCref;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
993 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
994 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
995
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
996 case TOKlazy:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
997 storageClass = STClazy;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
998 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
999 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1000
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1001 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1002 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1003 tb = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1004 at = parseDeclarator(tb, &ai);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1005 ae = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1006 if (token.value == TOKassign) // = defaultArg
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1007 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1008 ae = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1009 hasdefault = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1010 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1011 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1012 { if (hasdefault)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1013 error("default argument expected for %s",
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1014 ai ? ai->toChars() : at->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1015 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1016 if (token.value == TOKdotdotdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1017 { /* This is:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1018 * at ai ...
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1019 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1020
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1021 if (storageClass & (STCout | STCref))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1022 error("variadic argument cannot be out or ref");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1023 varargs = 2;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1024 a = new Parameter(storageClass, at, ai, ae);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1025 arguments->push(a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1026 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1027 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1028 }
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1029 a = new Parameter(storageClass, at, ai, ae);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1030 arguments->push(a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1031 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1032 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1033 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1034 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1035 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1036 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1037 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1038 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1039 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1040 *pvarargs = varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1041 return arguments;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1042 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1043
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1044
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1045 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1046 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1047
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1048 EnumDeclaration *Parser::parseEnum()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1049 { EnumDeclaration *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1050 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1051 Type *memtype;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1052 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1053
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1054 //printf("Parser::parseEnum()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1055 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1056 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1057 { id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1058 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1059 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1060 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1061 id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1062
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1063 if (token.value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1064 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1065 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1066 memtype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1067 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1068 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1069 memtype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1070
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1071 e = new EnumDeclaration(loc, id, memtype);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1072 if (token.value == TOKsemicolon && id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1073 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1074 else if (token.value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1075 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1076 //printf("enum definition\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1077 e->members = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1078 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1079 unsigned char *comment = token.blockComment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1080 while (token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1081 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1082 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1083 { EnumMember *em;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1084 Expression *value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1085 Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1086
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1087 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1088 ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1089 value = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1090 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1091 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1092 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1093 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1094 value = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1095 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1096 em = new EnumMember(loc, ident, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1097 e->members->push(em);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1098 if (token.value == TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1099 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1100 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1101 { addComment(em, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1102 comment = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1103 check(TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1104 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1105 addComment(em, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1106 comment = token.blockComment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1107 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1108 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1109 { error("enum member expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1110 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1111 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1112 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1113 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1114 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1115 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1116 error("enum declaration is invalid");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1117
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1118 //printf("-parseEnum() %s\n", e->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1119 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1120 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1121
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1122 /********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1123 * Parse struct, union, interface, class.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1124 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1125
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1126 Dsymbol *Parser::parseAggregate()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1127 { AggregateDeclaration *a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1128 int anon = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1129 enum TOK tok;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1130 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1131 TemplateParameters *tpl = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1132
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1133 //printf("Parser::parseAggregate()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1134 tok = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1135 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1136 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1137 { id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1138 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1139 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1140 { id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1141 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1142
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1143 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1144 { // Class template declaration.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1145
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1146 // Gather template parameter list
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1147 tpl = parseTemplateParameterList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1148 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1149 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1150
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1151 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1152 switch (tok)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1153 { case TOKclass:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1154 case TOKinterface:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1155 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1156 if (!id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1157 error("anonymous classes not allowed");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1158
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1159 // Collect base class(es)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1160 BaseClasses *baseclasses = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1161 if (token.value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1162 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1163 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1164 baseclasses = parseBaseClasses();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1165
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1166 if (token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1167 error("members expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1168 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1169
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1170 if (tok == TOKclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1171 a = new ClassDeclaration(loc, id, baseclasses);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1172 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1173 a = new InterfaceDeclaration(loc, id, baseclasses);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1174 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1175 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1176
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1177 case TOKstruct:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1178 if (id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1179 a = new StructDeclaration(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1180 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1181 anon = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1182 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1183
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1184 case TOKunion:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1185 if (id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1186 a = new UnionDeclaration(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1187 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1188 anon = 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1189 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1190
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1191 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1192 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1193 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1194 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1195 if (a && token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1196 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1197 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1198 else if (token.value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1199 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1200 //printf("aggregate definition\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1201 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1202 Array *decl = parseDeclDefs(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1203 if (token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1204 error("} expected following member declarations in aggregate");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1205 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1206 if (anon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1207 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1208 /* Anonymous structs/unions are more like attributes.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1209 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1210 return new AnonDeclaration(loc, anon - 1, decl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1211 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1212 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1213 a->members = decl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1214 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1215 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1216 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1217 error("{ } expected following aggregate declaration");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1218 a = new StructDeclaration(loc, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1219 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1220
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1221 if (tpl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1222 { Array *decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1223 TemplateDeclaration *tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1225 // Wrap a template around the aggregate declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1226 decldefs = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1227 decldefs->push(a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1228 tempdecl = new TemplateDeclaration(loc, id, tpl, NULL, decldefs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1229 return tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1230 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1231
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1232 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1233 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1234
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1235 /*******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1236 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1237
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1238 BaseClasses *Parser::parseBaseClasses()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1239 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1240 enum PROT protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1241 BaseClasses *baseclasses = new BaseClasses();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1243 for (; 1; nextToken())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1244 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1245 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1246 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1247 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1248 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1249 case TOKprivate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1250 protection = PROTprivate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1251 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1252 case TOKpackage:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1253 protection = PROTpackage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1254 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1255 case TOKprotected:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1256 protection = PROTprotected;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1257 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1258 case TOKpublic:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1259 protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1260 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1261 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1262 error("base classes expected instead of %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1263 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1264 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1265 BaseClass *b = new BaseClass(parseBasicType(), protection);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1266 baseclasses->push(b);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1267 if (token.value != TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1268 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1269 protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1270 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1271 return baseclasses;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1272 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1273
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1274 /**************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1275 * Parse constraint.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1276 * Constraint is of the form:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1277 * if ( ConstraintExpression )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1278 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1279
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1280 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1281 Expression *Parser::parseConstraint()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1282 { Expression *e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1283
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1284 if (token.value == TOKif)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1285 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1286 nextToken(); // skip over 'if'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1287 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1288 e = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1289 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1290 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1291 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1292 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1293 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1294
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1295 /**************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1296 * Parse a TemplateDeclaration.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1297 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1298
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1299 TemplateDeclaration *Parser::parseTemplateDeclaration()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1300 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1301 TemplateDeclaration *tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1302 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1303 TemplateParameters *tpl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1304 Array *decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1305 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1306
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1307 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1308 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1309 { error("TemplateIdentifier expected following template");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1310 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1311 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1312 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1313 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1314 tpl = parseTemplateParameterList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1315 if (!tpl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1316 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1317
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1318 if (token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1319 { error("members of template declaration expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1320 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1321 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1322 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1323 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1324 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1325 decldefs = parseDeclDefs(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1326 if (token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1327 { error("template member expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1328 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1329 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1330 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1331 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1332
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1333 tempdecl = new TemplateDeclaration(loc, id, tpl, NULL, decldefs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1334 return tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1335
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1336 Lerr:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1337 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1338 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1339
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1340 /******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1341 * Parse template parameter list.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1342 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1343
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1344 TemplateParameters *Parser::parseTemplateParameterList(int flag)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1345 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1346 TemplateParameters *tpl = new TemplateParameters();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1347
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1348 if (token.value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1349 { error("parenthesized TemplateParameterList expected following TemplateIdentifier");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1350 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1351 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1352 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1353
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1354 // Get array of TemplateParameters
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1355 if (token.value != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1356 { int isvariadic = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1357
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1358 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1359 { TemplateParameter *tp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1360 Identifier *tp_ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1361 Type *tp_spectype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1362 Type *tp_valtype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1363 Type *tp_defaulttype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1364 Expression *tp_specvalue = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1365 Expression *tp_defaultvalue = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1366 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1367
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1368 // Get TemplateParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1369
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1370 // First, look ahead to see if it is a TypeParameter or a ValueParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1371 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1372 if (token.value == TOKalias)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1373 { // AliasParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1374 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1375 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1376 { error("Identifier expected for template parameter");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1377 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1378 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1379 tp_ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1380 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1381 if (token.value == TOKcolon) // : Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1382 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1383 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1384 tp_spectype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1385 tp_spectype = parseDeclarator(tp_spectype, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1386 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1387 if (token.value == TOKassign) // = Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1388 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1389 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1390 tp_defaulttype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1391 tp_defaulttype = parseDeclarator(tp_defaulttype, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1392 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1393 tp = new TemplateAliasParameter(loc, tp_ident, tp_spectype, tp_defaulttype);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1394 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1395 else if (t->value == TOKcolon || t->value == TOKassign ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1396 t->value == TOKcomma || t->value == TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1397 { // TypeParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1398 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1399 { error("Identifier expected for template parameter");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1400 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1401 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1402 tp_ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1403 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1404 if (token.value == TOKcolon) // : Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1405 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1406 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1407 tp_spectype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1408 tp_spectype = parseDeclarator(tp_spectype, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1409 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1410 if (token.value == TOKassign) // = Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1411 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1412 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1413 tp_defaulttype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1414 tp_defaulttype = parseDeclarator(tp_defaulttype, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1415 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1416 tp = new TemplateTypeParameter(loc, tp_ident, tp_spectype, tp_defaulttype);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1417 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1418 else if (token.value == TOKidentifier && t->value == TOKdotdotdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1419 { // ident...
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1420 if (isvariadic)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1421 error("variadic template parameter must be last");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1422 isvariadic = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1423 tp_ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1424 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1425 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1426 tp = new TemplateTupleParameter(loc, tp_ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1427 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1428 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1429 else if (token.value == TOKthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1430 { // ThisParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1431 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1432 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1433 { error("identifier expected for template this parameter");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1434 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1435 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1436 tp_ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1437 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1438 if (token.value == TOKcolon) // : Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1439 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1440 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1441 tp_spectype = parseType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1442 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1443 if (token.value == TOKassign) // = Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1444 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1445 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1446 tp_defaulttype = parseType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1447 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1448 tp = new TemplateThisParameter(loc, tp_ident, tp_spectype, tp_defaulttype);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1449 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1450 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1451 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1452 { // ValueParameter
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1453 tp_valtype = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1454 tp_valtype = parseDeclarator(tp_valtype, &tp_ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1455 if (!tp_ident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1456 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1457 error("identifier expected for template value parameter");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1458 tp_ident = new Identifier("error", TOKidentifier);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1459 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1460 if (token.value == TOKcolon) // : CondExpression
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1461 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1462 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1463 tp_specvalue = parseCondExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1464 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1465 if (token.value == TOKassign) // = CondExpression
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1466 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1467 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1468 tp_defaultvalue = parseCondExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1469 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1470 tp = new TemplateValueParameter(loc, tp_ident, tp_valtype, tp_specvalue, tp_defaultvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1471 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1472 tpl->push(tp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1473 if (token.value != TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1474 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1475 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1476 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1477 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1478 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1479 Lerr:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1480 return tpl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1481 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1482
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1483 /******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1484 * Parse template mixin.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1485 * mixin Foo;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1486 * mixin Foo!(args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1487 * mixin a.b.c!(args).Foo!(args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1488 * mixin Foo!(args) identifier;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1489 * mixin typeof(expr).identifier!(args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1490 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1491
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1492 Dsymbol *Parser::parseMixin()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1493 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1494 TemplateMixin *tm;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1495 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1496 Type *tqual;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1497 Objects *tiargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1498 Array *idents;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1499
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1500 //printf("parseMixin()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1501 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1502 tqual = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1503 if (token.value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1504 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1505 id = Id::empty;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1506 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1507 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1508 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1509 if (token.value == TOKtypeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1510 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1511
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1512 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1513 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1514 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1515 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1516 tqual = new TypeTypeof(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1517 check(TOKdot);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1518 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1519 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1520 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1521 error("identifier expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1522 id = Id::empty;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1523 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1524 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1525 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1526 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1527 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1528
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1529 idents = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1530 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1531 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1532 tiargs = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1533 if (token.value == TOKnot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1534 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1535 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1536 tiargs = parseTemplateArgumentList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1537 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1538
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1539 if (token.value != TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1540 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1541
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1542 if (tiargs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1543 { TemplateInstance *tempinst = new TemplateInstance(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1544 tempinst->tiargs = tiargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1545 id = (Identifier *)tempinst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1546 tiargs = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1547 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1548 idents->push(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1549
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1550 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1551 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1552 { error("identifier expected following '.' instead of '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1553 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1554 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1555 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1556 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1557 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1558 idents->push(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1559
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1560 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1561 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1562 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1563 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1564 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1565 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1566 id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1567
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1568 tm = new TemplateMixin(loc, id, tqual, idents, tiargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1569 if (token.value != TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1570 error("';' expected after mixin");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1571 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1572
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1573 return tm;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1574 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1575
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1576 /******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1577 * Parse template argument list.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1578 * Input:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1579 * current token is opening '('
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1580 * Output:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1581 * current token is one after closing ')'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1582 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1583
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1584 Objects *Parser::parseTemplateArgumentList()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1585 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1586 //printf("Parser::parseTemplateArgumentList()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1587 Objects *tiargs = new Objects();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1588 if (token.value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1589 { error("!(TemplateArgumentList) expected following TemplateIdentifier");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1590 return tiargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1591 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1592 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1593
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1594 // Get TemplateArgumentList
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1595 if (token.value != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1596 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1597 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1598 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1599 // See if it is an Expression or a Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1600 if (isDeclaration(&token, 0, TOKreserved, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1601 { // Type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1602 Type *ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1603
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1604 // Get TemplateArgument
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1605 ta = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1606 ta = parseDeclarator(ta, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1607 tiargs->push(ta);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1608 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1609 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1610 { // Expression
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1611 Expression *ea;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1612
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1613 ea = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1614 tiargs->push(ea);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1615 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1616 if (token.value != TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1617 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1618 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1619 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1620 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1621 check(TOKrparen, "template argument list");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1622 return tiargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1623 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1624
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1625 Import *Parser::parseImport(Array *decldefs, int isstatic)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1626 { Import *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1627 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1628 Identifier *aliasid = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1629 Array *a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1630 Loc loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1631
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1632 //printf("Parser::parseImport()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1633 do
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1634 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1635 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1636 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1637 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1638 { error("Identifier expected following import");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1639 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1640 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1641
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1642 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1643 a = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1644 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1645 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1646 if (!aliasid && token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1647 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1648 aliasid = id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1649 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1650 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1651 while (token.value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1652 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1653 if (!a)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1654 a = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1655 a->push(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1656 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1657 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1658 { error("Identifier expected following package");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1659 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1660 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1661 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1662 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1663 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1664
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1665 s = new Import(loc, a, id, aliasid, isstatic);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1666 decldefs->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1667
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1668 /* Look for
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1669 * : alias=name, alias=name;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1670 * syntax.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1671 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1672 if (token.value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1673 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1674 do
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1675 { Identifier *name;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1676 Identifier *alias;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1677
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1678 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1679 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1680 { error("Identifier expected following :");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1681 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1682 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1683 alias = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1684 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1685 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1686 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1687 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1688 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1689 { error("Identifier expected following %s=", alias->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1690 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1691 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1692 name = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1693 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1694 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1695 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1696 { name = alias;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1697 alias = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1698 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1699 s->addAlias(name, alias);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1700 } while (token.value == TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1701 break; // no comma-separated imports of this form
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1702 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1703
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1704 aliasid = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1705 } while (token.value == TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1706
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1707 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1708 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1709 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1710 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1711 error("';' expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1712 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1713 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1714
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1715 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1716 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1717
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1718 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1719 Type *Parser::parseType(Identifier **pident, TemplateParameters **tpl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1720 { Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1721
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1722 /* Take care of the storage class prefixes that
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1723 * serve as type attributes:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1724 * const shared, shared const, const, invariant, shared
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1725 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1726 if (token.value == TOKconst && peekNext() == TOKshared && peekNext2() != TOKlparen ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1727 token.value == TOKshared && peekNext() == TOKconst && peekNext2() != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1728 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1729 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1730 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1731 /* shared const type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1732 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1733 t = parseType(pident, tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1734 t = t->makeSharedConst();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1735 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1736 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1737 else if (token.value == TOKconst && peekNext() != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1738 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1739 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1740 /* const type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1741 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1742 t = parseType(pident, tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1743 t = t->makeConst();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1744 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1745 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1746 else if ((token.value == TOKinvariant || token.value == TOKimmutable) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1747 peekNext() != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1748 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1749 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1750 /* invariant type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1751 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1752 t = parseType(pident, tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1753 t = t->makeInvariant();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1754 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1755 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1756 else if (token.value == TOKshared && peekNext() != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1757 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1758 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1759 /* shared type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1760 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1761 t = parseType(pident, tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1762 t = t->makeShared();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1763 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1764 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1765 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1766 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1767 t = parseDeclarator(t, pident, tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1768 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1769 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1770 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1771
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1772 Type *Parser::parseBasicType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1773 { Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1774 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1775 TypeQualified *tid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1776 TemplateInstance *tempinst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1777
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1778 //printf("parseBasicType()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1779 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1780 {
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
1781 case BASIC_TYPES_X(t):
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1782 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1783 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1784
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1785 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1786 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1787 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1788 if (token.value == TOKnot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1789 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1790 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1791 tempinst = new TemplateInstance(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1792 tempinst->tiargs = parseTemplateArgumentList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1793 tid = new TypeInstance(loc, tempinst);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1794 goto Lident2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1795 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1796 Lident:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1797 tid = new TypeIdentifier(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1798 Lident2:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1799 while (token.value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1800 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1801 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1802 { error("identifier expected following '.' instead of '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1803 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1804 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1805 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1806 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1807 if (token.value == TOKnot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1808 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1809 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1810 tempinst = new TemplateInstance(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1811 tempinst->tiargs = parseTemplateArgumentList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1812 tid->addIdent((Identifier *)tempinst);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1813 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1814 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1815 tid->addIdent(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1816 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1817 t = tid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1818 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1819
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1820 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1821 // Leading . as in .foo
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1822 id = Id::empty;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1823 goto Lident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1824
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1825 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1826 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1827
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1828 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1829 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1830 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1831 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1832 tid = new TypeTypeof(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1833 goto Lident2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1834 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1835
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1836 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1837 error("basic type expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1838 t = Type::tint32;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1839 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1840 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1841 return t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1842 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1843
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1844 /******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1845 * Parse things that follow the initial type t.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1846 * t *
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1847 * t []
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1848 * t [type]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1849 * t [expression]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1850 * t [expression .. expression]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1851 * t function
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1852 * t delegate
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1853 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1854
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1855 Type *Parser::parseBasicType2(Type *t)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1856 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1857 Type *ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1858 Type *ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1859
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1860 //printf("parseBasicType2()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1861 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1862 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1863 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1864 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1865 case TOKmul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1866 t = new TypePointer(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1867 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1868 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1869
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1870 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1871 #if LTORARRAYDECL
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1872 // Handle []. Make sure things like
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1873 // int[3][1] a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1874 // is (array[1] of array[3] of int)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1875 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1876 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1877 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1878 t = new TypeDArray(t); // []
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1879 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1880 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1881 else if (isDeclaration(&token, 0, TOKrbracket, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1882 { // It's an associative array declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1883 Type *index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1884
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1885 //printf("it's an associative array\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1886 index = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1887 index = parseDeclarator(index, NULL); // [ type ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1888 t = new TypeAArray(t, index);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1889 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1890 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1891 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1892 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1893 //printf("it's [expression]\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1894 inBrackets++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1895 Expression *e = parseExpression(); // [ expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1896 if (token.value == TOKslice)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1897 { Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1898
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1899 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1900 e2 = parseExpression(); // [ exp .. exp ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1901 t = new TypeSlice(t, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1902 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1903 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1904 t = new TypeSArray(t,e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1905 inBrackets--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1906 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1907 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1908 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1909 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1910 // Handle []. Make sure things like
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1911 // int[3][1] a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1912 // is (array[3] of array[1] of int)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1913 ts = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1914 while (token.value == TOKlbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1915 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1916 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1917 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1918 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1919 ta = new TypeDArray(t); // []
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1920 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1921 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1922 else if (isDeclaration(&token, 0, TOKrbracket, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1923 { // It's an associative array declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1924 Type *index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1925
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1926 //printf("it's an associative array\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1927 index = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1928 index = parseDeclarator(index, NULL); // [ type ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1929 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1930 ta = new TypeAArray(t, index);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1931 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1932 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1933 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1934 //printf("it's [expression]\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1935 Expression *e = parseExpression(); // [ expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1936 ta = new TypeSArray(t,e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1937 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1938 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1939 Type **pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1940 for (pt = &ts; *pt != t; pt = &(*pt)->next)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1941 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1942 *pt = ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1943 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1944 t = ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1945 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1946 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1947
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1948 case TOKdelegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1949 case TOKfunction:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1950 { // Handle delegate declaration:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1951 // t delegate(parameter list)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1952 // t function(parameter list)
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1953 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1954 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1955 enum TOK save = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1956
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1957 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1958 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1959 t = new TypeFunction(arguments, t, varargs, linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1960 if (save == TOKdelegate)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1961 t = new TypeDelegate(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1962 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1963 t = new TypePointer(t); // pointer to function
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1964 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1965 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1966
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1967 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1968 ts = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1969 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1970 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1971 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1972 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1973 return ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1974 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1975
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1976 Type *Parser::parseDeclarator(Type *t, Identifier **pident, TemplateParameters **tpl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1977 { Type *ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1978 Type *ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1979
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1980 //printf("parseDeclarator(tpl = %p)\n", tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1981 t = parseBasicType2(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1982
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1983 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1984 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1985
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1986 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1987 if (pident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1988 *pident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1989 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1990 error("unexpected identifer '%s' in declarator", token.ident->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1991 ts = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1992 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1993 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1994
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1995 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1996 /* Parse things with parentheses around the identifier, like:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1997 * int (*ident[3])[]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1998 * although the D style would be:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1999 * int[]*[3] ident
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2000 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2001 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2002 ts = parseDeclarator(t, pident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2003 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2004 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2005
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2006 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2007 ts = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2008 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2009 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2010
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2011 // parse DeclaratorSuffixes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2012 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2013 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2014 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2015 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2016 #if CARRAYDECL
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2017 /* Support C style array syntax:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2018 * int ident[]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2019 * as opposed to D-style:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2020 * int[] ident
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2021 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2022 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2023 { // This is the old C-style post [] syntax.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2024 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2025 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2026 { // It's a dynamic array
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2027 ta = new TypeDArray(t); // []
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2028 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2029 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2030 else if (isDeclaration(&token, 0, TOKrbracket, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2031 { // It's an associative array declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2032 Type *index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2033
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2034 //printf("it's an associative array\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2035 index = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2036 index = parseDeclarator(index, NULL); // [ type ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2037 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2038 ta = new TypeAArray(t, index);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2039 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2040 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2041 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2042 //printf("it's [expression]\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2043 Expression *e = parseExpression(); // [ expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2044 ta = new TypeSArray(t, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2045 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2046 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2047
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2048 /* Insert ta into
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2049 * ts -> ... -> t
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2050 * so that
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2051 * ts -> ... -> ta -> t
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2052 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2053 Type **pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2054 for (pt = &ts; *pt != t; pt = &(*pt)->next)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2055 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2056 *pt = ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2057 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2058 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2059 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2060 case TOKlparen:
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
2061 { Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2062 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2063
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2064 if (tpl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2065 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2066 /* Look ahead to see if this is (...)(...),
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2067 * i.e. a function template declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2068 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2069 if (peekPastParen(&token)->value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2070 { // It's a function template declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2071 //printf("function template declaration\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2072
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2073 // Gather template parameter list
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2074 *tpl = parseTemplateParameterList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2075 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2076 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2077
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2078 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2079 Type *ta = new TypeFunction(arguments, t, varargs, linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2080 Type **pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2081 for (pt = &ts; *pt != t; pt = &(*pt)->next)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2082 ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2083 *pt = ta;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2084 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2085 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2086 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2087 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2088 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2089
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2090 return ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2091 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2092
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2093 /**********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2094 * Parse Declarations.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2095 * These can be:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2096 * 1. declarations at global/class level
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2097 * 2. declarations at statement level
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2098 * Return array of Declaration *'s.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2099 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2100
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2101 Array *Parser::parseDeclarations()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2102 {
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
2103 StorageClass storage_class;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
2104 StorageClass stc;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2105 Type *ts;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2106 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2107 Type *tfirst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2108 Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2109 Array *a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2110 enum TOK tok = TOKreserved;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2111 unsigned char *comment = token.blockComment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2112 enum LINK link = linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2113
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2114 //printf("parseDeclarations()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2115 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2116 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2117 case TOKtypedef:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2118 case TOKalias:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2119 tok = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2120 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2121 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2122
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2123 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2124 tok = TOKreserved;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2125 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2126 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2127
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2128 storage_class = STCundefined;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2129 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2130 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2131 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2132 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2133 case TOKconst: stc = STCconst; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2134 case TOKstatic: stc = STCstatic; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2135 case TOKfinal: stc = STCfinal; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2136 case TOKauto: stc = STCauto; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2137 case TOKscope: stc = STCscope; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2138 case TOKoverride: stc = STCoverride; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2139 case TOKabstract: stc = STCabstract; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2140 case TOKsynchronized: stc = STCsynchronized; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2141 case TOKdeprecated: stc = STCdeprecated; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2142 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2143 case TOKnothrow: stc = STCnothrow; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2144 case TOKpure: stc = STCpure; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2145 case TOKref: stc = STCref; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2146 case TOKtls: stc = STCtls; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2147 case TOKenum: stc = STCmanifest; goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2148 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2149 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2150 if (storage_class & stc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2151 error("redundant storage class '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2152 storage_class = (STC) (storage_class | stc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2153 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2154 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2155
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2156 case TOKextern:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2157 if (peek(&token)->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2158 { stc = STCextern;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2159 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2160 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2161
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2162 link = parseLinkage();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2163 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2164
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2165 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2166 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2167 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2168 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2169 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2170
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2171 a = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2172
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2173 /* Look for auto initializers:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2174 * storage_class identifier = initializer;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2175 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2176 while (storage_class &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2177 token.value == TOKidentifier &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2178 peek(&token)->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2179 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2180 ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2181 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2182 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2183 Initializer *init = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2184 VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2185 v->storage_class = storage_class;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2186 a->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2187 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2188 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2189 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2190 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2191 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2192 else if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2193 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2194 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2195 if (!(token.value == TOKidentifier && peek(&token)->value == TOKassign))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2196 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2197 error("Identifier expected following comma");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2198 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2199 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2200 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2201 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2202 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2203 error("semicolon expected following auto declaration, not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2204 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2205 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2206
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2207 if (token.value == TOKclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2208 { AggregateDeclaration *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2209
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2210 s = (AggregateDeclaration *)parseAggregate();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2211 s->storage_class |= storage_class;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2212 a->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2213 addComment(s, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2214 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2215 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2216
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2217 ts = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2218 ts = parseBasicType2(ts);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2219 tfirst = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2220
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2221 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2222 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2223 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2224 TemplateParameters *tpl = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2225
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2226 ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2227 t = parseDeclarator(ts, &ident, &tpl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2228 assert(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2229 if (!tfirst)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2230 tfirst = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2231 else if (t != tfirst)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2232 error("multiple declarations must have the same type, not %s and %s",
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2233 tfirst->toChars(), t->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2234 if (!ident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2235 error("no identifier for declarator %s", t->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2236
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2237 if (tok == TOKtypedef || tok == TOKalias)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2238 { Declaration *v;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2239 Initializer *init = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2240
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2241 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2242 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2243 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2244 init = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2245 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2246 if (tok == TOKtypedef)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2247 v = new TypedefDeclaration(loc, ident, t, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2248 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2249 { if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2250 error("alias cannot have initializer");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2251 v = new AliasDeclaration(loc, ident, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2252 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2253 v->storage_class = storage_class;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2254 if (link == linkage)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2255 a->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2256 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2257 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2258 Array *ax = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2259 ax->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2260 Dsymbol *s = new LinkDeclaration(link, ax);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2261 a->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2262 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2263 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2264 { case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2265 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2266 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2267 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2268
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2269 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2270 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2271 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2272 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2273
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2274 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2275 error("semicolon expected to close %s declaration", Token::toChars(tok));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2276 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2277 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2278 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2279 else if (t->ty == Tfunction)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2280 { FuncDeclaration *f =
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2281 new FuncDeclaration(loc, 0, ident, storage_class, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2282 addComment(f, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2283 parseContracts(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2284 addComment(f, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2285 Dsymbol *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2286 if (link == linkage)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2287 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2288 s = f;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2289 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2290 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2291 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2292 Array *ax = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2293 ax->push(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2294 s = new LinkDeclaration(link, ax);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2296 if (tpl) // it's a function template
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2297 { Array *decldefs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2298 TemplateDeclaration *tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2299
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2300 // Wrap a template around the aggregate declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2301 decldefs = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2302 decldefs->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2303 tempdecl = new TemplateDeclaration(loc, s->ident, tpl, NULL, decldefs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2304 s = tempdecl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2305 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2306 addComment(s, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2307 a->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2308 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2309 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2310 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2311 Initializer *init = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2312 if (token.value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2313 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2314 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2315 init = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2316 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2317
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2318 VarDeclaration *v = new VarDeclaration(loc, t, ident, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2319 v->storage_class = storage_class;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2320 if (link == linkage)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2321 a->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2322 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2323 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2324 Array *ax = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2325 ax->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2326 Dsymbol *s = new LinkDeclaration(link, ax);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2327 a->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2328 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2329 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2330 { case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2331 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2332 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2333 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2334
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2335 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2336 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2337 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2338 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2339
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2340 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2341 error("semicolon expected, not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2342 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2343 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2344 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2345 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2346 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2347 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2348 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2349
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2350 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2351 * Parse auto declarations of the form:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2352 * storageClass ident = init, ident = init, ... ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2353 * and return the array of them.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2354 * Starts with token on the first ident.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2355 * Ends with scanner past closing ';'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2356 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2357
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2358 #if DMDV2
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
2359 Array *Parser::parseAutoDeclarations(StorageClass storageClass, unsigned char *comment)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2360 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2361 Array *a = new Array;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2362
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2363 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2364 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2365 Identifier *ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2366 nextToken(); // skip over ident
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2367 assert(token.value == TOKassign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2368 nextToken(); // skip over '='
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2369 Initializer *init = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2370 VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2371 v->storage_class = storageClass;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2372 a->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2373 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2374 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2375 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2376 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2377 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2378 else if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2379 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2380 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2381 if (token.value == TOKidentifier &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2382 peek(&token)->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2383 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2384 addComment(v, comment);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2385 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2386 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2387 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2388 error("Identifier expected following comma");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2389 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2390 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2391 error("semicolon expected following auto declaration, not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2392 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2393 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2394 return a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2395 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2396 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2397
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2398 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2399 * Parse contracts following function declaration.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2400 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2401
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2402 void Parser::parseContracts(FuncDeclaration *f)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2403 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2404 Type *tb;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2405 enum LINK linksave = linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2406
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2407 // The following is irrelevant, as it is overridden by sc->linkage in
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2408 // TypeFunction::semantic
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2409 linkage = LINKd; // nested functions have D linkage
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2410 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2411 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2412 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2413 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2414 if (f->frequire || f->fensure)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2415 error("missing body { ... } after in or out");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2416 f->fbody = parseStatement(PSsemi);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2417 f->endloc = endloc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2418 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2419
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2420 case TOKbody:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2421 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2422 f->fbody = parseStatement(PScurly);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2423 f->endloc = endloc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2424 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2425
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2426 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2427 if (f->frequire || f->fensure)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2428 error("missing body { ... } after in or out");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2429 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2430 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2431
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2432 #if 0 // Do we want this for function declarations, so we can do:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2433 // int x, y, foo(), z;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2434 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2435 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2436 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2437 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2438
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2439 #if 0 // Dumped feature
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2440 case TOKthrow:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2441 if (!f->fthrows)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2442 f->fthrows = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2443 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2444 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2445 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2446 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2447 tb = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2448 f->fthrows->push(tb);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2449 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2450 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2451 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2452 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2453 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2454 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2455 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2456 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2457 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2458
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2459 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2460 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2461 if (f->frequire)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2462 error("redundant 'in' statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2463 f->frequire = parseStatement(PScurly | PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2464 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2465
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2466 case TOKout:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2467 // parse: out (identifier) { statement }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2468 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2469 if (token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2470 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2471 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2472 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2473 error("(identifier) following 'out' expected, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2474 f->outId = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2475 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2476 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2477 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2478 if (f->fensure)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2479 error("redundant 'out' statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2480 f->fensure = parseStatement(PScurly | PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2481 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2482
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2483 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2484 error("semicolon expected following function declaration");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2485 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2486 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2487 linkage = linksave;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2488 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2489
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2490 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2491 * Parse initializer for variable declaration.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2492 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2493
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2494 Initializer *Parser::parseInitializer()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2495 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2496 StructInitializer *is;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2497 ArrayInitializer *ia;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2498 ExpInitializer *ie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2499 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2500 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2501 Initializer *value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2502 int comma;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2503 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2504 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2505 int braces;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2506 int brackets;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2507
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2508 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2509 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2510 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2511 /* Scan ahead to see if it is a struct initializer or
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2512 * a function literal.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2513 * If it contains a ';', it is a function literal.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2514 * Treat { } as a struct initializer.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2515 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2516 braces = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2517 for (t = peek(&token); 1; t = peek(t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2518 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2519 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2520 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2521 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2522 case TOKreturn:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2523 goto Lexpression;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2524
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2525 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2526 braces++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2527 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2528
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2529 case TOKrcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2530 if (--braces == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2531 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2532 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2533
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2534 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2535 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2536
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2537 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2538 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2539 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2540 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2541 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2542
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2543 is = new StructInitializer(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2544 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2545 comma = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2546 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2547 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2548 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2549 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2550 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2551 if (comma == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2552 error("comma expected separating field initializers");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2553 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2554 if (t->value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2555 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2556 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2557 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2558 nextToken(); // skip over ':'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2559 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2560 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2561 { id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2562 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2563 value = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2564 is->addInit(id, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2565 comma = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2566 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2567
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2568 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2569 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2570 comma = 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2571 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2572
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2573 case TOKrcurly: // allow trailing comma's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2574 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2575 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2576
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2577 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2578 error("found EOF instead of initializer");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2579 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2580
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2581 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2582 value = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2583 is->addInit(NULL, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2584 comma = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2585 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2586 //error("found '%s' instead of field initializer", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2587 //break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2588 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2589 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2590 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2591 return is;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2592
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2593 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2594 /* Scan ahead to see if it is an array initializer or
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2595 * an expression.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2596 * If it ends with a ';', it is an array initializer.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2597 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2598 brackets = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2599 for (t = peek(&token); 1; t = peek(t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2600 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2601 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2602 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2603 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2604 brackets++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2605 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2606
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2607 case TOKrbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2608 if (--brackets == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2609 { t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2610 if (t->value != TOKsemicolon &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2611 t->value != TOKcomma &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2612 t->value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2613 goto Lexpression;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2614 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2615 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2616 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2617
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2618 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2619 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2620
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2621 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2622 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2623 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2624 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2625 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2626
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2627 ia = new ArrayInitializer(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2628 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2629 comma = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2630 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2631 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2632 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2633 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2634 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2635 if (comma == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2636 { error("comma expected separating array initializers, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2637 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2638 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2639 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2640 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2641 if (!e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2642 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2643 if (token.value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2644 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2645 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2646 value = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2647 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2648 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2649 { value = new ExpInitializer(e->loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2650 e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2651 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2652 ia->addInit(e, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2653 comma = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2654 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2655
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2656 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2657 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2658 if (comma == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2659 error("comma expected separating array initializers, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2660 value = parseInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2661 ia->addInit(NULL, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2662 comma = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2663 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2664
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2665 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2666 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2667 comma = 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2668 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2669
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2670 case TOKrbracket: // allow trailing comma's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2671 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2672 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2673
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2674 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2675 error("found '%s' instead of array initializer", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2676 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2677 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2678 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2679 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2680 return ia;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2681
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2682 case TOKvoid:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2683 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2684 if (t->value == TOKsemicolon || t->value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2685 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2686 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2687 return new VoidInitializer(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2688 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2689 goto Lexpression;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2690
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2691 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2692 Lexpression:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2693 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2694 ie = new ExpInitializer(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2695 return ie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2696 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2697 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2698
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2699 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2700 * Parses default argument initializer expression that is an assign expression,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2701 * with special handling for __FILE__ and __LINE__.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2702 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2703
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2704 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2705 Expression *Parser::parseDefaultInitExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2706 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2707 if (token.value == TOKfile ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2708 token.value == TOKline)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2709 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2710 Token *t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2711 if (t->value == TOKcomma || t->value == TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2712 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2713
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2714 if (token.value == TOKfile)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2715 e = new FileInitExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2716 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2717 e = new LineInitExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2718 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2719 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2720 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2721 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2722
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2723 Expression *e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2724 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2725 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2726 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2727
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2728 /*****************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2729 * Input:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2730 * flags PSxxxx
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2731 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2732
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2733 Statement *Parser::parseStatement(int flags)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2734 { Statement *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2735 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2736 Condition *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2737 Statement *ifbody;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2738 Statement *elsebody;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2739 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2740
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2741 //printf("parseStatement()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2742
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2743 if (flags & PScurly && token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2744 error("statement expected to be { }, not %s", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2745
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2746 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2747 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2748 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2749 /* A leading identifier can be a declaration, label, or expression.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2750 * The easiest case to check first is label:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2751 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2752 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2753 if (t->value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2754 { // It's a label
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2755
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2756 Identifier *ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2757 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2758 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2759 s = parseStatement(PSsemi);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2760 s = new LabelStatement(loc, ident, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2761 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2762 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2763 // fallthrough to TOKdot
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2764 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2765 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2766 if (isDeclaration(&token, 2, TOKreserved, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2767 goto Ldeclaration;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2768 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2769 goto Lexp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2770 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2771
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2772 case TOKassert:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2773 case TOKthis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2774 case TOKsuper:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2775 case TOKint32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2776 case TOKuns32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2777 case TOKint64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2778 case TOKuns64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2779 case TOKfloat32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2780 case TOKfloat64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2781 case TOKfloat80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2782 case TOKimaginary32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2783 case TOKimaginary64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2784 case TOKimaginary80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2785 case TOKcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2786 case TOKwcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2787 case TOKdcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2788 case TOKnull:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2789 case TOKtrue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2790 case TOKfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2791 case TOKstring:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2792 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2793 case TOKcast:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2794 case TOKmul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2795 case TOKmin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2796 case TOKadd:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2797 case TOKplusplus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2798 case TOKminusminus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2799 case TOKnew:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2800 case TOKdelete:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2801 case TOKdelegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2802 case TOKfunction:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2803 case TOKtypeid:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2804 case TOKis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2805 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2806 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2807 case TOKtraits:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2808 case TOKfile:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2809 case TOKline:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2810 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2811 Lexp:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2812 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2813
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2814 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2815 check(TOKsemicolon, "statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2816 s = new ExpStatement(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2817 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2818 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2819
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2820 case TOKstatic:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2821 { // Look ahead to see if it's static assert() or static if()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2822 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2823
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2824 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2825 if (t->value == TOKassert)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2826 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2827 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2828 s = new StaticAssertStatement(parseStaticAssert());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2829 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2830 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2831 if (t->value == TOKif)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2832 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2833 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2834 condition = parseStaticIfCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2835 goto Lcondition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2836 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2837 goto Ldeclaration;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2838 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2839
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
2840 case BASIC_TYPES:
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2841 case TOKtypedef:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2842 case TOKalias:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2843 case TOKconst:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2844 case TOKauto:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2845 case TOKextern:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2846 case TOKfinal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2847 case TOKinvariant:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2848 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2849 case TOKimmutable:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2850 case TOKshared:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2851 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2852 // case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2853 Ldeclaration:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2854 { Array *a;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2855
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2856 a = parseDeclarations();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2857 if (a->dim > 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2858 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2859 Statements *as = new Statements();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2860 as->reserve(a->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2861 for (int i = 0; i < a->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2862 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2863 Dsymbol *d = (Dsymbol *)a->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2864 s = new DeclarationStatement(loc, d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2865 as->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2866 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2867 s = new CompoundDeclarationStatement(loc, as);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2868 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2869 else if (a->dim == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2870 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2871 Dsymbol *d = (Dsymbol *)a->data[0];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2872 s = new DeclarationStatement(loc, d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2873 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2874 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2875 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2876 if (flags & PSscope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2877 s = new ScopeStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2878 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2879 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2880
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2881 case TOKstruct:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2882 case TOKunion:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2883 case TOKclass:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2884 case TOKinterface:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2885 { Dsymbol *d;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2886
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2887 d = parseAggregate();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2888 s = new DeclarationStatement(loc, d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2889 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2890 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2891
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2892 case TOKenum:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2893 { Dsymbol *d;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2894
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2895 d = parseEnum();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2896 s = new DeclarationStatement(loc, d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2897 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2898 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2899
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2900 case TOKmixin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2901 { t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2902 if (t->value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2903 { // mixin(string)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2904 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2905 check(TOKlparen, "mixin");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2906 Expression *e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2907 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2908 check(TOKsemicolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2909 s = new CompileStatement(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2910 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2911 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2912 Dsymbol *d = parseMixin();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2913 s = new DeclarationStatement(loc, d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2914 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2915 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2916
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2917 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2918 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2919 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2920 Statements *statements = new Statements();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2921 while (token.value != TOKrcurly && token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2922 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2923 statements->push(parseStatement(PSsemi | PScurlyscope));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2924 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2925 endloc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2926 s = new CompoundStatement(loc, statements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2927 if (flags & (PSscope | PScurlyscope))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2928 s = new ScopeStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2929 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2930 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2931 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2932
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2933 case TOKwhile:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2934 { Expression *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2935 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2936
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2937 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2938 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2939 condition = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2940 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2941 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2942 s = new WhileStatement(loc, condition, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2943 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2944 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2945
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2946 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2947 if (!(flags & PSsemi))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2948 error("use '{ }' for an empty statement, not a ';'");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2949 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2950 s = new ExpStatement(loc, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2951 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2952
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2953 case TOKdo:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2954 { Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2955 Expression *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2956
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2957 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2958 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2959 check(TOKwhile);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2960 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2961 condition = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2962 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2963 s = new DoStatement(loc, body, condition);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2964 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2965 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2966
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2967 case TOKfor:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2968 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2969 Statement *init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2970 Expression *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2971 Expression *increment;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2972 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2973
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2974 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2975 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2976 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2977 { init = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2978 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2979 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2980 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2981 { init = parseStatement(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2982 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2983 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2984 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2985 condition = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2986 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2987 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2988 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2989 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2990 condition = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2991 check(TOKsemicolon, "for condition");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2992 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2993 if (token.value == TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2994 { increment = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2995 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2996 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2997 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2998 { increment = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2999 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3000 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3001 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3002 s = new ForStatement(loc, init, condition, increment, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3003 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3004 s = new ScopeStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3005 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3006 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3007
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3008 case TOKforeach:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3009 case TOKforeach_reverse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3010 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3011 enum TOK op = token.value;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3012 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3013
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3014 Statement *d;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3015 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3016 Expression *aggr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3017
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3018 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3019 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3020
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3021 arguments = new Parameters();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3022
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3023 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3024 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3025 Type *tb;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3026 Identifier *ai = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3027 Type *at;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3028 unsigned storageClass;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3029 Parameter *a;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3030
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3031 storageClass = STCin;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3032 if (token.value == TOKinout || token.value == TOKref)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3033 { storageClass = STCref;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3034 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3035 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3036 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3037 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3038 Token *t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3039 if (t->value == TOKcomma || t->value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3040 { ai = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3041 at = NULL; // infer argument type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3042 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3043 goto Larg;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3044 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3045 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3046 tb = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3047 at = parseDeclarator(tb, &ai);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3048 if (!ai)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3049 error("no identifier for declarator %s", at->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3050 Larg:
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3051 a = new Parameter(storageClass, at, ai, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3052 arguments->push(a);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3053 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3054 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3055 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3056 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3057 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3058 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3059 check(TOKsemicolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3060
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3061 aggr = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3062 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3063 body = parseStatement(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3064 s = new ForeachStatement(loc, op, arguments, aggr, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3065 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3066 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3067
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3068 case TOKif:
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3069 { Parameter *arg = NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3070 Expression *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3071 Statement *ifbody;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3072 Statement *elsebody;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3073
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3074 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3075 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3076
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3077 if (token.value == TOKauto)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3078 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3079 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3080 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3081 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3082 Token *t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3083 if (t->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3084 {
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3085 arg = new Parameter(STCin, NULL, token.ident, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3086 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3087 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3088 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3089 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3090 { error("= expected following auto identifier");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3091 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3092 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3093 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3094 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3095 { error("identifier expected following auto");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3096 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3097 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3098 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3099 else if (isDeclaration(&token, 2, TOKassign, NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3100 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3101 Type *tb;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3102 Type *at;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3103 Identifier *ai;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3104
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3105 tb = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3106 at = parseDeclarator(tb, &ai);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3107 check(TOKassign);
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3108 arg = new Parameter(STCin, at, ai, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3109 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3110
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3111 // Check for " ident;"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3112 else if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3113 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3114 Token *t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3115 if (t->value == TOKcomma || t->value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3116 {
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
3117 arg = new Parameter(STCin, NULL, token.ident, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3118 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3119 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3120 if (1 || !global.params.useDeprecated)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3121 error("if (v; e) is deprecated, use if (auto v = e)");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3122 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3123 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3124
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3125 condition = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3126 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3127 ifbody = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3128 if (token.value == TOKelse)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3129 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3130 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3131 elsebody = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3132 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3133 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3134 elsebody = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3135 s = new IfStatement(loc, arg, condition, ifbody, elsebody);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3136 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3137 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3138
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3139 case TOKscope:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3140 if (peek(&token)->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3141 goto Ldeclaration; // scope used as storage class
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3142 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3143 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3144 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3145 { error("scope identifier expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3146 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3147 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3148 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3149 { TOK t = TOKon_scope_exit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3150 Identifier *id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3151
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3152 if (id == Id::exit)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3153 t = TOKon_scope_exit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3154 else if (id == Id::failure)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3155 t = TOKon_scope_failure;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3156 else if (id == Id::success)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3157 t = TOKon_scope_success;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3158 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3159 error("valid scope identifiers are exit, failure, or success, not %s", id->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3160 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3161 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3162 Statement *st = parseStatement(PScurlyscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3163 s = new OnScopeStatement(loc, t, st);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3164 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3165 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3166
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3167 case TOKdebug:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3168 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3169 condition = parseDebugCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3170 goto Lcondition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3171
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3172 case TOKversion:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3173 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3174 condition = parseVersionCondition();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3175 goto Lcondition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3176
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3177 Lcondition:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3178 ifbody = parseStatement(0 /*PSsemi*/);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3179 elsebody = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3180 if (token.value == TOKelse)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3181 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3182 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3183 elsebody = parseStatement(0 /*PSsemi*/);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3184 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3185 s = new ConditionalStatement(loc, condition, ifbody, elsebody);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3186 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3187
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3188 case TOKpragma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3189 { Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3190 Expressions *args = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3191 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3192
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3193 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3194 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3195 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3196 { error("pragma(identifier expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3197 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3198 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3199 ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3200 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3201 if (token.value == TOKcomma && peekNext() != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3202 args = parseArguments(); // pragma(identifier, args...);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3203 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3204 check(TOKrparen); // pragma(identifier);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3205 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3206 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3207 body = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3208 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3209 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3210 body = parseStatement(PSsemi);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3211 s = new PragmaStatement(loc, ident, args, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3212 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3213 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3215 case TOKswitch:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3216 { Expression *condition;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3217 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3218
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3219 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3220 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3221 condition = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3222 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3223 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3224 s = new SwitchStatement(loc, condition, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3225 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3226 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3227
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3228 case TOKcase:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3229 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3230 Statements *statements;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3231 Array cases; // array of Expression's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3232
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3233 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3234 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3235 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3236 exp = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3237 cases.push(exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3238 if (token.value != TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3239 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3240 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3241 check(TOKcolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3243 statements = new Statements();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3244 while (token.value != TOKcase &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3245 token.value != TOKdefault &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3246 token.value != TOKeof &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3247 token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3248 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3249 statements->push(parseStatement(PSsemi | PScurlyscope));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3250 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3251 s = new CompoundStatement(loc, statements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3252 s = new ScopeStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3253
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3254 // Keep cases in order by building the case statements backwards
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3255 for (int i = cases.dim; i; i--)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3256 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3257 exp = (Expression *)cases.data[i - 1];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3258 s = new CaseStatement(loc, exp, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3259 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3260 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3261 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3262
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3263 case TOKdefault:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3264 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3265 Statements *statements;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3266
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3267 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3268 check(TOKcolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3269
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3270 statements = new Statements();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3271 while (token.value != TOKcase &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3272 token.value != TOKdefault &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3273 token.value != TOKeof &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3274 token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3275 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3276 statements->push(parseStatement(PSsemi | PScurlyscope));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3277 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3278 s = new CompoundStatement(loc, statements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3279 s = new ScopeStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3280 s = new DefaultStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3281 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3282 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3283
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3284 case TOKreturn:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3285 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3286
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3287 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3288 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3289 exp = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3290 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3291 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3292 check(TOKsemicolon, "return statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3293 s = new ReturnStatement(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3294 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3296
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3297 case TOKbreak:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3298 { Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3299
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3300 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3301 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3302 { ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3303 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3304 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3305 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3306 ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3307 check(TOKsemicolon, "break statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3308 s = new BreakStatement(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3309 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3310 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3311
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3312 case TOKcontinue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3313 { Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3314
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3315 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3316 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3317 { ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3318 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3319 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3320 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3321 ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3322 check(TOKsemicolon, "continue statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3323 s = new ContinueStatement(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3324 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3325 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3326
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3327 case TOKgoto:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3328 { Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3329
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3330 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3331 if (token.value == TOKdefault)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3332 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3333 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3334 s = new GotoDefaultStatement(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3335 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3336 else if (token.value == TOKcase)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3337 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3338 Expression *exp = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3339
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3340 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3341 if (token.value != TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3342 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3343 s = new GotoCaseStatement(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3344 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3345 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3346 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3347 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3348 { error("Identifier expected following goto");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3349 ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3350 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3351 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3352 { ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3353 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3354 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3355 s = new GotoStatement(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3356 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3357 check(TOKsemicolon, "goto statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3358 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3359 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3360
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3361 case TOKsynchronized:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3362 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3363 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3364
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3365 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3366 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3367 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3368 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3369 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3370 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3371 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3372 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3373 exp = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3374 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3375 s = new SynchronizedStatement(loc, exp, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3376 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3377 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3378
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3379 case TOKwith:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3380 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3381 Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3382
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3383 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3384 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3385 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3386 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3387 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3388 s = new WithStatement(loc, exp, body);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3389 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3390 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3391
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3392 case TOKtry:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3393 { Statement *body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3394 Array *catches = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3395 Statement *finalbody = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3396
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3397 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3398 body = parseStatement(PSscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3399 while (token.value == TOKcatch)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3400 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3401 Statement *handler;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3402 Catch *c;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3403 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3404 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3405 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3406
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3407 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3408 if (token.value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3409 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3410 t = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3411 id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3412 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3413 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3414 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3415 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3416 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3417 id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3418 t = parseDeclarator(t, &id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3419 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3420 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3421 handler = parseStatement(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3422 c = new Catch(loc, t, id, handler);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3423 if (!catches)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3424 catches = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3425 catches->push(c);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3426 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3427
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3428 if (token.value == TOKfinally)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3429 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3430 finalbody = parseStatement(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3431 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3432
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3433 s = body;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3434 if (!catches && !finalbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3435 error("catch or finally expected following try");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3436 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3437 { if (catches)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3438 s = new TryCatchStatement(loc, body, catches);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3439 if (finalbody)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3440 s = new TryFinallyStatement(loc, s, finalbody);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3441 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3442 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3443 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3444
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3445 case TOKthrow:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3446 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3447
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3448 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3449 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3450 check(TOKsemicolon, "throw statement");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3451 s = new ThrowStatement(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3452 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3453 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3454
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3455 case TOKvolatile:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3456 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3457 s = parseStatement(PSsemi | PScurlyscope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3458 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3459 if (!global.params.useDeprecated)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3460 error("volatile statements deprecated; used synchronized statements instead");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3461 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3462 s = new VolatileStatement(loc, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3463 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3464
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3465 case TOKasm:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3466 { Statements *statements;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3467 Identifier *label;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3468 Loc labelloc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3469 Token *toklist;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3470 Token **ptoklist;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3471
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3472 // Parse the asm block into a sequence of AsmStatements,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3473 // each AsmStatement is one instruction.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3474 // Separate out labels.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3475 // Defer parsing of AsmStatements until semantic processing.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3476
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3477 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3478 check(TOKlcurly);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3479 toklist = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3480 ptoklist = &toklist;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3481 label = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3482 statements = new Statements();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3483 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3484 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3485 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3486 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3487 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3488 if (!toklist)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3489 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3490 // Look ahead to see if it is a label
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3491 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3492 if (t->value == TOKcolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3493 { // It's a label
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3494 label = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3495 labelloc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3496 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3497 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3498 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3499 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3500 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3501 goto Ldefault;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3502
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3503 case TOKrcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3504 if (toklist || label)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3505 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3506 error("asm statements must end in ';'");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3507 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3508 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3509
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3510 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3511 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3512 if (toklist || label)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3513 { // Create AsmStatement from list of tokens we've saved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3514 s = new AsmStatement(this->loc, toklist);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3515 toklist = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3516 ptoklist = &toklist;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3517 if (label)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3518 { s = new LabelStatement(labelloc, label, s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3519 label = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3520 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3521 statements->push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3522 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3523 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3524 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3525
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3526 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3527 /* { */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3528 error("matching '}' expected, not end of file");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3529 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3530
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3531 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3532 Ldefault:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3533 *ptoklist = new Token();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3534 memcpy(*ptoklist, &token, sizeof(Token));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3535 ptoklist = &(*ptoklist)->next;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3536 *ptoklist = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3537
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3538 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3539 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3540 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3541 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3542 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3543 s = new AsmBlockStatement(loc, statements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3544 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3545 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3546 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3547
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3548 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3549 error("found '%s' instead of statement", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3550 goto Lerror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3551
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3552 Lerror:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3553 while (token.value != TOKrcurly &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3554 token.value != TOKsemicolon &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3555 token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3556 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3557 if (token.value == TOKsemicolon)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3558 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3559 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3560 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3561 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3562
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3563 return s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3564 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3565
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3566 void Parser::check(enum TOK value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3567 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3568 check(loc, value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3569 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3570
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3571 void Parser::check(Loc loc, enum TOK value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3572 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3573 if (token.value != value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3574 error(loc, "found '%s' when expecting '%s'", token.toChars(), Token::toChars(value));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3575 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3576 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3577
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3578 void Parser::check(enum TOK value, const char *string)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3579 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3580 if (token.value != value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3581 error("found '%s' when expecting '%s' following '%s'",
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3582 token.toChars(), Token::toChars(value), string);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3583 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3584 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3585
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3586 /************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3587 * Determine if the scanner is sitting on the start of a declaration.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3588 * Input:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3589 * needId 0 no identifier
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3590 * 1 identifier optional
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3591 * 2 must have identifier
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3592 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3593
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3594 int Parser::isDeclaration(Token *t, int needId, enum TOK endtok, Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3595 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3596 //printf("isDeclaration(needId = %d)\n", needId);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3597 int haveId = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3598
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3599 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3600 if ((t->value == TOKconst || t->value == TOKinvariant) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3601 peek(t)->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3602 { /* const type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3603 * invariant type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3604 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3605 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3606 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3607 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3608
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3609 if (!isBasicType(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3610 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3611 if (!isDeclarator(&t, &haveId, endtok))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3612 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3613 if ( needId == 1 ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3614 (needId == 0 && !haveId) ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3615 (needId == 2 && haveId))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3616 { if (pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3617 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3618 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3619 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3620 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3621 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3622 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3623
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3624 int Parser::isBasicType(Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3625 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3626 // This code parallels parseBasicType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3627 Token *t = *pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3628 Token *t2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3629 int parens;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3630
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3631 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3632 {
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
3633 case BASIC_TYPES:
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3634 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3635 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3636
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3637 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3638 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3639 if (t->value == TOKnot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3640 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3641 goto L4;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3642 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3643 goto L3;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3644 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3645 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3646 L2:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3647 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3648 L3:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3649 if (t->value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3650 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3651 Ldot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3652 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3653 if (t->value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3654 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3655 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3656 if (t->value != TOKnot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3657 goto L3;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3658 L4:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3659 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3660 if (t->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3661 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3662 if (!skipParens(t, &t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3663 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3664 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3665 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3666 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3667 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3668 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3669
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3670 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3671 goto Ldot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3672
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3673 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3674 /* typeof(exp).identifier...
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3675 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3676 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3677 if (t->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3678 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3679 if (!skipParens(t, &t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3680 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3681 goto L2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3682
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3683 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3684 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3685 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3686 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3687 //printf("is\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3688 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3689
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3690 Lfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3691 //printf("is not\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3692 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3693 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3694
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3695 int Parser::isDeclarator(Token **pt, int *haveId, enum TOK endtok)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3696 { // This code parallels parseDeclarator()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3697 Token *t = *pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3698 int parens;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3699
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3700 //printf("Parser::isDeclarator()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3701 //t->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3702 if (t->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3703 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3704
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3705 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3706 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3707 parens = FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3708 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3709 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3710 case TOKmul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3711 //case TOKand:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3712 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3713 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3714
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3715 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3716 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3717 if (t->value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3718 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3719 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3720 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3721 else if (isDeclaration(t, 0, TOKrbracket, &t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3722 { // It's an associative array declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3723 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3724 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3725 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3726 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3727 // [ expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3728 // [ expression .. expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3729 if (!isExpression(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3730 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3731 if (t->value == TOKslice)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3732 { t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3733 if (!isExpression(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3734 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3735 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3736 if (t->value != TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3737 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3738 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3739 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3740 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3741
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3742 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3743 if (*haveId)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3744 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3745 *haveId = TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3746 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3747 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3748
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3749 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3750 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3751
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3752 if (t->value == TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3753 return FALSE; // () is not a declarator
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3754
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3755 /* Regard ( identifier ) as not a declarator
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3756 * BUG: what about ( *identifier ) in
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3757 * f(*p)(x);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3758 * where f is a class instance with overloaded () ?
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3759 * Should we just disallow C-style function pointer declarations?
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3760 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3761 if (t->value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3762 { Token *t2 = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3763 if (t2->value == TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3764 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3765 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3766
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3767
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3768 if (!isDeclarator(&t, haveId, TOKrparen))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3769 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3770 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3771 parens = TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3772 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3773
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3774 case TOKdelegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3775 case TOKfunction:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3776 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3777 if (!isParameters(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3778 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3779 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3780 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3781 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3782 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3783
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3784 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3785 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3786 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3787 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3788 #if CARRAYDECL
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3789 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3790 parens = FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3791 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3792 if (t->value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3793 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3794 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3795 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3796 else if (isDeclaration(t, 0, TOKrbracket, &t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3797 { // It's an associative array declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3798 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3799 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3800 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3801 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3802 // [ expression ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3803 if (!isExpression(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3804 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3805 if (t->value != TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3806 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3807 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3808 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3809 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3810 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3811
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3812 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3813 parens = FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3814 if (!isParameters(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3815 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3816 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3817 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3818 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3819 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3820 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3821 case TOKconst:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3822 case TOKinvariant:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3823 case TOKimmutable:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3824 case TOKshared:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3825 case TOKpure:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3826 case TOKnothrow:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3827 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3828 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3829 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3830 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3831 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3832 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3833 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3834 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3835 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3836
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3837 // Valid tokens that follow a declaration
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3838 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3839 case TOKrbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3840 case TOKassign:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3841 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3842 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3843 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3844 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3845 // The !parens is to disallow unnecessary parentheses
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3846 if (!parens && (endtok == TOKreserved || endtok == t->value))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3847 { *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3848 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3849 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3850 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3851
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3852 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3853 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3854 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3855 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3856 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3857
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3858
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3859 int Parser::isParameters(Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3860 { // This code parallels parseParameters()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3861 Token *t = *pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3862 int tmp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3863
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3864 //printf("isParameters()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3865 if (t->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3866 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3867
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3868 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3869 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3870 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3871 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3872 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3873 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3874 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3875
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3876 case TOKdotdotdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3877 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3878 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3879
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3880 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3881 case TOKout:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3882 case TOKinout:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3883 case TOKref:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3884 case TOKlazy:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3885 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3886 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3887 if (!isBasicType(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3888 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3889 tmp = FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3890 if (t->value != TOKdotdotdot &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3891 !isDeclarator(&t, &tmp, TOKreserved))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3892 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3893 if (t->value == TOKassign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3894 { t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3895 if (!isExpression(&t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3896 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3897 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3898 if (t->value == TOKdotdotdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3899 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3900 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3901 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3902 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3903 if (t->value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3904 { t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3905 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3906 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3907 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3908 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3909 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3910 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3911 if (t->value != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3912 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3913 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3914 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3915 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3916 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3917
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3918 int Parser::isExpression(Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3919 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3920 // This is supposed to determine if something is an expression.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3921 // What it actually does is scan until a closing right bracket
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3922 // is found.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3923
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3924 Token *t = *pt;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3925 int brnest = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3926 int panest = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3927
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3928 for (;; t = peek(t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3929 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3930 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3931 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3932 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3933 brnest++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3934 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3935
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3936 case TOKrbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3937 if (--brnest >= 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3938 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3939 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3940
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3941 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3942 panest++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3943 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3944
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3945 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3946 if (brnest || panest)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3947 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3948 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3949
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3950 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3951 if (--panest >= 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3952 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3953 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3954
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3955 case TOKslice:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3956 if (brnest)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3957 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3958 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3959
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3960 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3961 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3962
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3963 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3964 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3965 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3966 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3967 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3968
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3969 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3970 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3971 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3972
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3973 /**********************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3974 * Skip over
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3975 * instance foo.bar(parameters...)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3976 * Output:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3977 * if (pt), *pt is set to the token following the closing )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3978 * Returns:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3979 * 1 it's valid instance syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3980 * 0 invalid instance syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3981 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3982
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3983 int Parser::isTemplateInstance(Token *t, Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3984 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3985 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3986 if (t->value != TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3987 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3988 if (t->value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3989 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3990 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3991 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3992 while (t->value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3993 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3994 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3995 if (t->value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3996 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3997 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3998 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3999 if (t->value != TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4000 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4001
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4002 // Skip over the template arguments
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4003 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4004 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4005 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4006 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4007 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4008 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4009 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4010 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4011 if (!skipParens(t, &t))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4012 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4013 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4014 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4015 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4016 case TOKcomma:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4017 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4018 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4019 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4020 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4021 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4022 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4023 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4024 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4025 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4026
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4027 if (t->value != TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4028 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4029 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4030 if (t->value != TOKrparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4031 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4032 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4033 if (pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4034 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4035 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4036
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4037 Lfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4038 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4039 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4040
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4041 /*******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4042 * Skip parens, brackets.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4043 * Input:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4044 * t is on opening (
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4045 * Output:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4046 * *pt is set to closing token, which is ')' on success
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4047 * Returns:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4048 * !=0 successful
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4049 * 0 some parsing error
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4050 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4051
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4052 int Parser::skipParens(Token *t, Token **pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4053 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4054 int parens = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4055
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4056 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4057 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4058 switch (t->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4059 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4060 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4061 parens++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4062 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4063
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4064 case TOKrparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4065 parens--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4066 if (parens < 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4067 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4068 if (parens == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4069 goto Ldone;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4070 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4071
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4072 case TOKeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4073 case TOKsemicolon:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4074 goto Lfalse;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4075
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4076 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4077 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4078 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4079 t = peek(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4080 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4081
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4082 Ldone:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4083 if (*pt)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4084 *pt = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4085 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4086
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4087 Lfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4088 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4089 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4090
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4091 /********************************* Expression Parser ***************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4092
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4093 Expression *Parser::parsePrimaryExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4094 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4095 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4096 Identifier *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4097 enum TOK save;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4098 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4099
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4100 //printf("parsePrimaryExp(): loc = %d\n", loc.linnum);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4101 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4102 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4103 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4104 id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4105 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4106 if (token.value == TOKnot && peek(&token)->value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4107 { // identifier!(template-argument-list)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4108 TemplateInstance *tempinst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4109
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4110 tempinst = new TemplateInstance(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4111 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4112 tempinst->tiargs = parseTemplateArgumentList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4113 e = new ScopeExp(loc, tempinst);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4114 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4115 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4116 e = new IdentifierExp(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4117 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4118
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4119 case TOKdollar:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4120 if (!inBrackets)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4121 error("'$' is valid only inside [] of index or slice");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4122 e = new DollarExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4123 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4124 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4125
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4126 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4127 // Signal global scope '.' operator with "" identifier
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4128 e = new IdentifierExp(loc, Id::empty);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4129 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4130
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4131 case TOKthis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4132 e = new ThisExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4133 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4134 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4135
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4136 case TOKsuper:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4137 e = new SuperExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4138 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4139 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4140
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4141 case TOKint32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4142 e = new IntegerExp(loc, (d_int32)token.int64value, Type::tint32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4143 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4144 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4145
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4146 case TOKuns32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4147 e = new IntegerExp(loc, (d_uns32)token.uns64value, Type::tuns32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4148 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4149 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4150
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4151 case TOKint64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4152 e = new IntegerExp(loc, token.int64value, Type::tint64);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4153 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4154 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4155
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4156 case TOKuns64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4157 e = new IntegerExp(loc, token.uns64value, Type::tuns64);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4158 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4159 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4160
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4161 case TOKfloat32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4162 e = new RealExp(loc, token.float80value, Type::tfloat32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4163 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4164 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4165
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4166 case TOKfloat64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4167 e = new RealExp(loc, token.float80value, Type::tfloat64);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4168 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4169 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4170
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4171 case TOKfloat80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4172 e = new RealExp(loc, token.float80value, Type::tfloat80);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4173 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4174 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4175
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4176 case TOKimaginary32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4177 e = new RealExp(loc, token.float80value, Type::timaginary32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4178 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4179 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4180
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4181 case TOKimaginary64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4182 e = new RealExp(loc, token.float80value, Type::timaginary64);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4183 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4184 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4185
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4186 case TOKimaginary80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4187 e = new RealExp(loc, token.float80value, Type::timaginary80);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4188 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4189 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4190
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4191 case TOKnull:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4192 e = new NullExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4193 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4194 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4195
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4196 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4197 case TOKfile:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4198 { char *s = loc.filename ? loc.filename : mod->ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4199 e = new StringExp(loc, s, strlen(s), 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4200 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4201 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4202 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4203
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4204 case TOKline:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4205 e = new IntegerExp(loc, loc.linnum, Type::tint32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4206 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4207 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4208 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4209
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4210 case TOKtrue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4211 e = new IntegerExp(loc, 1, Type::tbool);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4212 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4213 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4215 case TOKfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4216 e = new IntegerExp(loc, 0, Type::tbool);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4217 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4218 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4219
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4220 case TOKcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4221 e = new IntegerExp(loc, (d_uns8)token.uns64value, Type::tchar);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4222 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4223 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4225 case TOKwcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4226 e = new IntegerExp(loc, (d_uns16)token.uns64value, Type::twchar);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4227 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4228 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4229
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4230 case TOKdcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4231 e = new IntegerExp(loc, (d_uns32)token.uns64value, Type::tdchar);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4232 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4233 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4234
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4235 case TOKstring:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4236 { unsigned char *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4237 unsigned len;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4238 unsigned char postfix;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4239
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4240 // cat adjacent strings
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4241 s = token.ustring;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4242 len = token.len;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4243 postfix = token.postfix;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4244 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4245 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4246 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4247 if (token.value == TOKstring)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4248 { unsigned len1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4249 unsigned len2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4250 unsigned char *s2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4251
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4252 if (token.postfix)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4253 { if (token.postfix != postfix)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4254 error("mismatched string literal postfixes '%c' and '%c'", postfix, token.postfix);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4255 postfix = token.postfix;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4256 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4257
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4258 len1 = len;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4259 len2 = token.len;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4260 len = len1 + len2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4261 s2 = (unsigned char *)mem.malloc((len + 1) * sizeof(unsigned char));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4262 memcpy(s2, s, len1 * sizeof(unsigned char));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4263 memcpy(s2 + len1, token.ustring, (len2 + 1) * sizeof(unsigned char));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4264 s = s2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4265 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4266 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4267 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4268 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4269 e = new StringExp(loc, s, len, postfix);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4270 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4271 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4272
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
4273 case BASIC_TYPES_X(t):
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4274 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4275 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4276 check(TOKdot, t->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4277 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4278 { error("found '%s' when expecting identifier following '%s.'", token.toChars(), t->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4279 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4280 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4281 e = typeDotIdExp(loc, t, token.ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4282 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4283 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4284
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4285 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4286 { Expression *exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4287
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4288 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4289 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4290 exp = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4291 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4292 t = new TypeTypeof(loc, exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4293 e = new TypeExp(loc, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4294 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4296
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4297 case TOKtypeid:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4298 { Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4299
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4300 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4301 check(TOKlparen, "typeid");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4302 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4303 t = parseDeclarator(t,NULL); // ( type )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4304 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4305 e = new TypeidExp(loc, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4306 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4307 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4308
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4309 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4310 case TOKtraits:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4311 { /* __traits(identifier, args...)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4312 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4313 Identifier *ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4314 Objects *args = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4315
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4316 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4317 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4318 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4319 { error("__traits(identifier, args...) expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4320 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4321 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4322 ident = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4323 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4324 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4325 args = parseTemplateArgumentList2(); // __traits(identifier, args...)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4326 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4327 check(TOKrparen); // __traits(identifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4328
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4329 e = new TraitsExp(loc, ident, args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4330 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4331 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4332 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4333
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4334 case TOKis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4335 { Type *targ;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4336 Identifier *ident = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4337 Type *tspec = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4338 enum TOK tok = TOKreserved;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4339 enum TOK tok2 = TOKreserved;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4340 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4341
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4342 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4343 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4344 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4345 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4346 targ = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4347 targ = parseDeclarator(targ, &ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4348 if (token.value == TOKcolon || token.value == TOKequal)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4349 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4350 tok = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4351 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4352 if (tok == TOKequal &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4353 (token.value == TOKtypedef ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4354 token.value == TOKstruct ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4355 token.value == TOKunion ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4356 token.value == TOKclass ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4357 token.value == TOKsuper ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4358 token.value == TOKenum ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4359 token.value == TOKinterface ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4360 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4361 token.value == TOKconst && peek(&token)->value == TOKrparen ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4362 token.value == TOKinvariant && peek(&token)->value == TOKrparen ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4363 token.value == TOKimmutable && peek(&token)->value == TOKrparen ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4364 token.value == TOKshared && peek(&token)->value == TOKrparen ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4365 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4366 token.value == TOKfunction ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4367 token.value == TOKdelegate ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4368 token.value == TOKreturn))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4369 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4370 tok2 = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4371 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4372 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4373 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4374 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4375 tspec = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4376 tspec = parseDeclarator(tspec, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4377 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4378 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4379 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4380 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4381 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4382 { error("(type identifier : specialization) expected following is");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4383 goto Lerr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4384 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4385 e = new IsExp(loc, targ, ident, tok, tspec, tok2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4386 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4387 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4388
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4389 case TOKassert:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4390 { Expression *msg = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4391
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4392 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4393 check(TOKlparen, "assert");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4394 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4395 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4396 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4397 msg = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4398 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4399 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4400 e = new AssertExp(loc, e, msg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4401 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4402 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4403
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4404 case TOKmixin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4405 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4406 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4407 check(TOKlparen, "mixin");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4408 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4409 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4410 e = new CompileExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4411 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4412 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4413
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4414 case TOKimport:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4415 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4416 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4417 check(TOKlparen, "import");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4418 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4419 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4420 e = new FileExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4421 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4422 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4423
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4424 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4425 if (peekPastParen(&token)->value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4426 { // (arguments) { statements... }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4427 save = TOKdelegate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4428 goto case_delegate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4429 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4430 // ( expression )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4431 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4432 e = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4433 check(loc, TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4434 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4435
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4436 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4437 { /* Parse array literals and associative array literals:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4438 * [ value, value, value ... ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4439 * [ key:value, key:value, key:value ... ]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4440 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4441 Expressions *values = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4442 Expressions *keys = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4443
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4444 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4445 if (token.value != TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4446 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4447 while (token.value != TOKeof)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4448 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4449 Expression *e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4450 if (token.value == TOKcolon && (keys || values->dim == 0))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4451 { nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4452 if (!keys)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4453 keys = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4454 keys->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4455 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4456 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4457 else if (keys)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4458 { error("'key:value' expected for associative array literal");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4459 delete keys;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4460 keys = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4461 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4462 values->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4463 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4464 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4465 check(TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4466 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4467 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4468 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4469
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4470 if (keys)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4471 e = new AssocArrayLiteralExp(loc, keys, values);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4472 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4473 e = new ArrayLiteralExp(loc, values);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4474 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4475 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4476
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4477 case TOKlcurly:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4478 // { statements... }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4479 save = TOKdelegate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4480 goto case_delegate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4481
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4482 case TOKfunction:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4483 case TOKdelegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4484 save = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4485 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4486 case_delegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4487 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4488 /* function type(parameters) { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4489 * delegate type(parameters) { body }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4490 */
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
4491 Parameters *arguments;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4492 int varargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4493 FuncLiteralDeclaration *fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4494 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4495
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4496 if (token.value == TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4497 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4498 t = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4499 varargs = 0;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
4500 arguments = new Parameters();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4501 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4502 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4503 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4504 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4505 t = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4506 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4507 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4508 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4509 t = parseBasicType2(t); // function return type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4510 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4511 arguments = parseParameters(&varargs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4512 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4513 t = new TypeFunction(arguments, t, varargs, linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4514 fd = new FuncLiteralDeclaration(loc, 0, t, save, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4515 parseContracts(fd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4516 e = new FuncExp(loc, fd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4517 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4518 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4519
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4520 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4521 error("expression expected, not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4522 Lerr:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4523 // Anything for e, as long as it's not NULL
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4524 e = new IntegerExp(loc, 0, Type::tint32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4525 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4526 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4527 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4528 return parsePostExp(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4529 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4530
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4531 Expression *Parser::parsePostExp(Expression *e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4532 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4533 Loc loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4534
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4535 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4536 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4537 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4538 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4539 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4540 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4541 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4542 if (token.value == TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4543 { Identifier *id = token.ident;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4544
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4545 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4546 if (token.value == TOKnot && peek(&token)->value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4547 { // identifier!(template-argument-list)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4548 TemplateInstance *tempinst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4549
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4550 tempinst = new TemplateInstance(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4551 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4552 tempinst->tiargs = parseTemplateArgumentList();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4553 e = new DotTemplateInstanceExp(loc, e, tempinst);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4554 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4555 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4556 e = new DotIdExp(loc, e, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4557 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4558 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4559 else if (token.value == TOKnew)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4560 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4561 e = parseNewExp(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4562 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4563 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4564 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4565 error("identifier expected following '.', not '%s'", token.toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4566 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4567
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4568 case TOKplusplus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4569 e = new PostExp(TOKplusplus, loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4570 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4571
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4572 case TOKminusminus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4573 e = new PostExp(TOKminusminus, loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4574 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4575
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4576 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4577 e = new CallExp(loc, e, parseArguments());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4578 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4579
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4580 case TOKlbracket:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4581 { // array dereferences:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4582 // array[index]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4583 // array[]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4584 // array[lwr .. upr]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4585 Expression *index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4586 Expression *upr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4588 inBrackets++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4589 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4590 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4591 { // array[]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4592 e = new SliceExp(loc, e, NULL, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4593 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4594 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4595 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4596 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4597 index = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4598 if (token.value == TOKslice)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4599 { // array[lwr .. upr]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4600 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4601 upr = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4602 e = new SliceExp(loc, e, index, upr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4603 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4604 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4605 { // array[index, i2, i3, i4, ...]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4606 Expressions *arguments = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4607 arguments->push(index);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4608 if (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4609 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4610 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4611 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4612 { Expression *arg;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4613
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4614 arg = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4615 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4616 if (token.value == TOKrbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4617 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4618 check(TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4619 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4620 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4621 e = new ArrayExp(loc, e, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4622 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4623 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4624 inBrackets--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4625 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4626 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4627 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4628
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4629 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4630 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4631 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4632 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4633 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4634 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4635
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4636 Expression *Parser::parseUnaryExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4637 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4638 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4639
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4640 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4641 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4642 case TOKand:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4643 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4644 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4645 e = new AddrExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4646 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4647
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4648 case TOKplusplus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4649 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4650 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4651 e = new AddAssignExp(loc, e, new IntegerExp(loc, 1, Type::tint32));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4652 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4653
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4654 case TOKminusminus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4655 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4656 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4657 e = new MinAssignExp(loc, e, new IntegerExp(loc, 1, Type::tint32));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4658 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4659
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4660 case TOKmul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4661 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4662 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4663 e = new PtrExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4664 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4665
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4666 case TOKmin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4667 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4668 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4669 e = new NegExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4670 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4671
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4672 case TOKadd:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4673 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4674 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4675 e = new UAddExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4676 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4677
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4678 case TOKnot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4679 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4680 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4681 e = new NotExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4682 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4683
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4684 case TOKtilde:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4685 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4686 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4687 e = new ComExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4688 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4689
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4690 case TOKdelete:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4691 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4692 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4693 e = new DeleteExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4694 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4695
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4696 case TOKnew:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4697 e = parseNewExp(NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4698 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4699
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4700 case TOKcast: // cast(type) expression
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4701 { Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4702
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4703 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4704 check(TOKlparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4705 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4706 t = parseDeclarator(t,NULL); // ( type )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4707 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4708
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4709 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4710 e = new CastExp(loc, e, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4711 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4712 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4713
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4714 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4715 { Token *tk;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4716
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4717 tk = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4718 #if CCASTSYNTAX
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4719 // If cast
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4720 if (isDeclaration(tk, 0, TOKrparen, &tk))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4721 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4722 tk = peek(tk); // skip over right parenthesis
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4723 switch (tk->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4724 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4725 case TOKnot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4726 tk = peek(tk);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4727 if (tk->value == TOKis) // !is
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4728 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4729 case TOKdot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4730 case TOKplusplus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4731 case TOKminusminus:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4732 case TOKdelete:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4733 case TOKnew:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4734 case TOKlparen:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4735 case TOKidentifier:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4736 case TOKthis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4737 case TOKsuper:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4738 case TOKint32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4739 case TOKuns32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4740 case TOKint64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4741 case TOKuns64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4742 case TOKfloat32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4743 case TOKfloat64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4744 case TOKfloat80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4745 case TOKimaginary32v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4746 case TOKimaginary64v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4747 case TOKimaginary80v:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4748 case TOKnull:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4749 case TOKtrue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4750 case TOKfalse:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4751 case TOKcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4752 case TOKwcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4753 case TOKdcharv:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4754 case TOKstring:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4755 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4756 case TOKtilde:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4757 case TOKand:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4758 case TOKmul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4759 case TOKmin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4760 case TOKadd:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4761 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4762 case TOKfunction:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4763 case TOKdelegate:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4764 case TOKtypeof:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4765 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4766 case TOKfile:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4767 case TOKline:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4768 #endif
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1602
diff changeset
4769 case BASIC_TYPES: // (type)int.size
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4770 { // (type) una_exp
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4771 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4772
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4773 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4774 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4775 t = parseDeclarator(t,NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4776 check(TOKrparen);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4777
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4778 // if .identifier
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4779 if (token.value == TOKdot)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4780 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4781 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4782 if (token.value != TOKidentifier)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4783 { error("Identifier expected following (type).");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4784 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4785 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4786 e = typeDotIdExp(loc, t, token.ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4787 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4788 e = parsePostExp(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4789 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4790 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4791 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4792 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4793 e = new CastExp(loc, e, t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4794 error("C style cast illegal, use %s", e->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4795 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4796 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4797 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4798 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4799 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4800 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4801 e = parsePrimaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4802 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4803 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4804 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4805 e = parsePrimaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4806 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4807 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4808 assert(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4809 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4810 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4811
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4812 Expression *Parser::parseMulExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4813 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4814 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4815 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4816
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4817 e = parseUnaryExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4818 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4819 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4820 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4821 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4822 case TOKmul: nextToken(); e2 = parseUnaryExp(); e = new MulExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4823 case TOKdiv: nextToken(); e2 = parseUnaryExp(); e = new DivExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4824 case TOKmod: nextToken(); e2 = parseUnaryExp(); e = new ModExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4825
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4826 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4827 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4828 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4829 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4830 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4831 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4832 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4833
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4834 Expression *Parser::parseAddExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4835 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4836 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4837 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4838
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4839 e = parseMulExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4840 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4841 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4842 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4843 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4844 case TOKadd: nextToken(); e2 = parseMulExp(); e = new AddExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4845 case TOKmin: nextToken(); e2 = parseMulExp(); e = new MinExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4846 case TOKtilde: nextToken(); e2 = parseMulExp(); e = new CatExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4847
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4848 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4849 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4850 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4851 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4852 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4853 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4854 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4855
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4856 Expression *Parser::parseShiftExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4857 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4858 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4859 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4860
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4861 e = parseAddExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4862 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4863 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4864 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4865 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4866 case TOKshl: nextToken(); e2 = parseAddExp(); e = new ShlExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4867 case TOKshr: nextToken(); e2 = parseAddExp(); e = new ShrExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4868 case TOKushr: nextToken(); e2 = parseAddExp(); e = new UshrExp(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4869
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4870 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4871 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4872 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4873 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4874 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4875 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4876 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4877
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4878 Expression *Parser::parseRelExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4879 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4880 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4881 enum TOK op;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4882 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4883
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4884 e = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4885 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4886 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4887 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4888 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4889 case TOKlt:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4890 case TOKle:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4891 case TOKgt:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4892 case TOKge:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4893 case TOKunord:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4894 case TOKlg:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4895 case TOKleg:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4896 case TOKule:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4897 case TOKul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4898 case TOKuge:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4899 case TOKug:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4900 case TOKue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4901 op = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4902 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4903 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4904 e = new CmpExp(op, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4905 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4906
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4907 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4908 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4909 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4910 e = new InExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4911 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4912
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4913 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4914 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4915 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4916 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4917 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4918 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4919 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4920
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4921 Expression *Parser::parseEqualExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4922 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4923 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4924 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4925 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4926
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4927 e = parseRelExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4928 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4929 { enum TOK value = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4930
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4931 switch (value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4932 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4933 case TOKequal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4934 case TOKnotequal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4935 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4936 e2 = parseRelExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4937 e = new EqualExp(value, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4938 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4939
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4940 case TOKidentity:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4941 error("'===' is no longer legal, use 'is' instead");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4942 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4943
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4944 case TOKnotidentity:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4945 error("'!==' is no longer legal, use '!is' instead");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4946 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4947
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4948 case TOKis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4949 value = TOKidentity;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4950 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4951
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4952 case TOKnot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4953 // Attempt to identify '!is'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4954 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4955 if (t->value != TOKis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4956 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4957 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4958 value = TOKnotidentity;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4959 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4960
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4961 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4962 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4963 e2 = parseRelExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4964 e = new IdentityExp(value, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4965 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4966
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4967 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4968 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4969 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4970 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4971 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4972 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4973 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4974
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4975 Expression *Parser::parseCmpExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4976 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4977 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4978 Token *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4979 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4980
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4981 e = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4982 enum TOK op = token.value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4983
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4984 switch (op)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4985 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4986 case TOKequal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4987 case TOKnotequal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4988 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4989 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4990 e = new EqualExp(op, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4991 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4992
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4993 case TOKis:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4994 op = TOKidentity;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4995 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4996
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4997 case TOKnot:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4998 // Attempt to identify '!is'
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4999 t = peek(&token);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5000 if (t->value != TOKis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5001 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5002 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5003 op = TOKnotidentity;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5004 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5005
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5006 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5007 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5008 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5009 e = new IdentityExp(op, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5010 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5011
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5012 case TOKlt:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5013 case TOKle:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5014 case TOKgt:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5015 case TOKge:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5016 case TOKunord:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5017 case TOKlg:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5018 case TOKleg:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5019 case TOKule:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5020 case TOKul:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5021 case TOKuge:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5022 case TOKug:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5023 case TOKue:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5024 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5025 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5026 e = new CmpExp(op, loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5027 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5028
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5029 case TOKin:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5030 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5031 e2 = parseShiftExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5032 e = new InExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5033 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5034
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5035 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5036 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5037 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5038 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5039 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5040
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5041 Expression *Parser::parseAndExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5042 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5043 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5044 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5045
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5046 if (global.params.Dversion == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5047 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5048 e = parseEqualExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5049 while (token.value == TOKand)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5050 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5051 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5052 e2 = parseEqualExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5053 e = new AndExp(loc,e,e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5054 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5055 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5056 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5057 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5058 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5059 e = parseCmpExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5060 while (token.value == TOKand)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5061 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5062 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5063 e2 = parseCmpExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5064 e = new AndExp(loc,e,e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5065 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5066 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5067 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5068 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5069 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5070
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5071 Expression *Parser::parseXorExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5072 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5073 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5074 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5075
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5076 e = parseAndExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5077 while (token.value == TOKxor)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5078 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5079 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5080 e2 = parseAndExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5081 e = new XorExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5082 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5083 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5084 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5085
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5086 Expression *Parser::parseOrExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5087 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5088 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5089 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5090
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5091 e = parseXorExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5092 while (token.value == TOKor)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5093 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5094 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5095 e2 = parseXorExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5096 e = new OrExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5097 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5098 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5099 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5100
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5101 Expression *Parser::parseAndAndExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5102 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5103 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5104 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5105
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5106 e = parseOrExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5107 while (token.value == TOKandand)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5108 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5109 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5110 e2 = parseOrExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5111 e = new AndAndExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5112 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5113 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5114 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5115
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5116 Expression *Parser::parseOrOrExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5117 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5118 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5119 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5120
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5121 e = parseAndAndExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5122 while (token.value == TOKoror)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5123 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5124 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5125 e2 = parseAndAndExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5126 e = new OrOrExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5127 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5128 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5129 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5130
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5131 Expression *Parser::parseCondExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5132 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5133 Expression *e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5134 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5135 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5136
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5137 e = parseOrOrExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5138 if (token.value == TOKquestion)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5139 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5140 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5141 e1 = parseExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5142 check(TOKcolon);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5143 e2 = parseCondExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5144 e = new CondExp(loc, e, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5145 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5146 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5147 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5148
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5149 Expression *Parser::parseAssignExp()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5150 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5151 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5152 Loc loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5153
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5154 e = parseCondExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5155 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5156 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5157 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5158 switch (token.value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5159 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5160 #define X(tok,ector) \
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5161 case tok: nextToken(); e2 = parseAssignExp(); e = new ector(loc,e,e2); continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5162
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5163 X(TOKassign, AssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5164 X(TOKaddass, AddAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5165 X(TOKminass, MinAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5166 X(TOKmulass, MulAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5167 X(TOKdivass, DivAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5168 X(TOKmodass, ModAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5169 X(TOKandass, AndAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5170 X(TOKorass, OrAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5171 X(TOKxorass, XorAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5172 X(TOKshlass, ShlAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5173 X(TOKshrass, ShrAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5174 X(TOKushrass, UshrAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5175 X(TOKcatass, CatAssignExp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5176
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5177 #undef X
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5178 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5179 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5180 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5181 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5182 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5183 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5184 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5185
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5186 Expression *Parser::parseExpression()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5187 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5188 Expression *e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5189 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5190
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5191 //printf("Parser::parseExpression() loc = %d\n", loc.linnum);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5192 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5193 while (token.value == TOKcomma)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5194 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5195 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5196 e2 = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5197 e = new CommaExp(loc, e, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5198 loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5199 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5200 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5201 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5202
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5203
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5204 /*************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5205 * Collect argument list.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5206 * Assume current token is '(' or '['.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5207 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5208
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5209 Expressions *Parser::parseArguments()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5210 { // function call
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5211 Expressions *arguments;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5212 Expression *arg;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5213 enum TOK endtok;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5215 arguments = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5216 if (token.value == TOKlbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5217 endtok = TOKrbracket;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5218 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5219 endtok = TOKrparen;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5220
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5221 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5222 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5223 if (token.value != endtok)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5224 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5225 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5226 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5227 arg = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5228 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5229 if (token.value == endtok)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5230 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5231 check(TOKcomma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5232 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5233 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5234 check(endtok);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5235 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5236 return arguments;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5237 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5238
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5239 /*******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5240 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5241
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5242 Expression *Parser::parseNewExp(Expression *thisexp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5243 { Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5244 Expressions *newargs;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5245 Expressions *arguments = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5246 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5247 Loc loc = this->loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5248
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5249 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5250 newargs = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5251 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5252 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5253 newargs = parseArguments();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5254 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5255
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5256 // An anonymous nested class starts with "class"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5257 if (token.value == TOKclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5258 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5259 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5260 if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5261 arguments = parseArguments();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5262
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5263 BaseClasses *baseclasses = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5264 if (token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5265 baseclasses = parseBaseClasses();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5266
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5267 Identifier *id = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5268 ClassDeclaration *cd = new ClassDeclaration(loc, id, baseclasses);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5269
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5270 if (token.value != TOKlcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5271 { error("{ members } expected for anonymous class");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5272 cd->members = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5273 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5274 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5275 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5276 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5277 Array *decl = parseDeclDefs(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5278 if (token.value != TOKrcurly)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5279 error("class member expected");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5280 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5281 cd->members = decl;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5282 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5283
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5284 e = new NewAnonClassExp(loc, thisexp, newargs, cd, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5285
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5286 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5287 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5288
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5289 #if LTORARRAYDECL
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5290 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5291 t = parseBasicType2(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5292 if (t->ty == Taarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5293 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5294 Type *index = ((TypeAArray *)t)->index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5295
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5296 Expression *e = index->toExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5297 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5298 { arguments = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5299 arguments->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5300 t = new TypeDArray(t->next);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5301 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5302 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5303 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5304 error("need size of rightmost array, not type %s", index->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5305 return new NullExp(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5306 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5307 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5308 else if (t->ty == Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5309 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5310 TypeSArray *tsa = (TypeSArray *)t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5311 Expression *e = tsa->dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5312
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5313 arguments = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5314 arguments->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5315 t = new TypeDArray(t->next);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5316 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5317 else if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5318 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5319 arguments = parseArguments();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5320 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5321 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5322 t = parseBasicType();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5323 while (token.value == TOKmul)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5324 { t = new TypePointer(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5325 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5326 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5327 if (token.value == TOKlbracket)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5328 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5329 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5330
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5331 nextToken();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5332 e = parseAssignExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5333 arguments = new Array();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5334 arguments->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5335 check(TOKrbracket);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5336 t = parseDeclarator(t, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5337 t = new TypeDArray(t);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5338 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5339 else if (token.value == TOKlparen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5340 arguments = parseArguments();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5341 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5342 e = new NewExp(loc, thisexp, newargs, t, arguments);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5343 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5344 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5346 /**********************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5347 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5348
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5349 void Parser::addComment(Dsymbol *s, unsigned char *blockComment)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5350 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5351 s->addComment(combineComments(blockComment, token.lineComment));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5352 token.lineComment = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5353 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5354
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5355
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5356 /********************************* ***************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5357