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

Refactored classes that inherit from Node. Added methods addChild(), addOptChild(), addChildren(), addOptChildren() to class Node. Refactored subclasses to use the new methods instead of appending directly to the array Node.children. Moved enums StorageClass and Protection to new module dil.Enums. Added members stc, prot, isStatic() and isPulic() to Declaration.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 03 Dec 2007 22:44:27 +0100
parents cfb3805768b6
children b991f49628a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8ba2570de175 Initial import.
aziz
parents:
diff changeset
1 /++
8ba2570de175 Initial import.
aziz
parents:
diff changeset
2 Author: Aziz Köksal
249
32d354584b28 - Upgraded license notices to GPL3.
aziz
parents: 248
diff changeset
3 License: GPL3
0
8ba2570de175 Initial import.
aziz
parents:
diff changeset
4 +/
326
4a7359b88c11 - Added package 'dil' to module declarations.
aziz
parents: 325
diff changeset
5 module dil.Parser;
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
6 import dil.Lexer;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
7 import dil.SyntaxTree;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
8 import dil.Token;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
9 import dil.Messages;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
10 import dil.Information;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
11 import dil.Declarations;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
12 import dil.Statements;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
13 import dil.Expressions;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
14 import dil.Types;
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
15 import dil.Enums;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
16 import common;
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
17
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
18 private alias TOK T;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
19
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
20 class ImportParser : Parser
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
21 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
22 this(char[] srcText, string fileName)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
23 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
24 super(srcText, fileName);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
25 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
26
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
27 override Declarations start()
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
28 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
29 auto decls = new Declarations;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
30 super.init();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
31 if (token.type == T.Module)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
32 decls ~= parseModuleDeclaration();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
33 while (token.type != T.EOF)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
34 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
35 if (token.type == T.Import)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
36 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
37 auto decl = parseImportDeclaration();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
38 assert(decl && decl.kind == NodeKind.ImportDeclaration);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
39 super.imports ~= cast(ImportDeclaration)cast(void*)decl;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
40 decls ~= decl;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
41 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
42 else
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
43 nT();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
44 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
45 return decls;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
46 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
47 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
48
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
49 class Parser
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
50 {
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
51 Lexer lx;
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
52 Token* token; /// Current non-whitespace token.
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
53 Token* prevToken; /// Previous non-whitespace token.
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
54
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
55 Information[] errors;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
56
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
57 ImportDeclaration[] imports;
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
58
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
59 this(char[] srcText, string filePath)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
60 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
61 lx = new Lexer(srcText, filePath);
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
62 }
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
63
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
64 private void init()
206
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
65 {
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
66 nT();
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
67 prevToken = token;
206
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
68 }
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
69
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
70 void nT()
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
71 {
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
72 prevToken = token;
132
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
73 do
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
74 {
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
75 lx.nextToken();
239
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
76 token = lx.token;
314
ebd21bbf296e - Added Whitespace, Sheband and Hashline to enum TOK. TOK.Whitespace is a flag and tokens that are considered whitespace are flagged as such.
aziz
parents: 313
diff changeset
77 } while (token.isWhitespace) // Skip whitespace
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
78 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
79
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
80 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
81 Start the parser and return the parsed Declarations.
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
82 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
83 Declarations start()
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
84 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
85 init();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
86 auto begin = token;
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
87 auto decls = new Declarations;
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
88 if (token.type == T.Module)
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
89 decls ~= parseModuleDeclaration();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
90 decls.addOptChildren(parseDeclarationDefinitions());
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
91 set(decls, begin);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
92 return decls;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
93 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
94
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
95 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
96 Start the parser and return the parsed Expression.
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
97 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
98 Expression start2()
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
99 {
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
100 init();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
101 return parseExpression();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
102 }
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
103
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
104 uint trying;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
105 uint errorCount;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
106
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
107 /++
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
108 This method executes the delegate parseMethod and when an error occurred
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
109 the state of the lexer and parser are restored.
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
110 +/
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
111 ReturnType try_(ReturnType)(ReturnType delegate() parseMethod, out bool success)
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
112 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
113 auto oldToken = this.token;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
114 auto oldPrevToken = this.prevToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
115 auto oldCount = this.errorCount;
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
116
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
117 ++trying;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
118 auto result = parseMethod();
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
119 --trying;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
120 // Check if an error occurred.
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
121 if (errorCount != oldCount)
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
122 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
123 // Restore members.
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
124 token = oldToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
125 prevToken = oldPrevToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
126 lx.token = oldToken;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
127 errorCount = oldCount;
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
128 success = false;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
129 }
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
130 else
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
131 success = true;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
132 return result;
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
133 }
105
df34ec47fb81 - Added getState() method and State struct to Lexer.
aziz
parents: 104
diff changeset
134
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
135 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
136 Sets the begin and end tokens of an AST node.
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
137 +/
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
138 Class set(Class)(Class node, Token* begin)
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
139 {
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
140 node.setTokens(begin, this.prevToken);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
141 return node;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
142 }
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
143
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
144 /++
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
145 Returns true if set() has been called on a node.
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
146 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
147 bool isNodeSet(Node node)
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
148 {
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
149 return node.begin !is null && node.end !is null;
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
150 }
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
151
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
152 TOK peekNext()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
153 {
239
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
154 Token* next = token;
296
3a2afc425ceb - Fix in peekNext(): need to skip comments.
aziz
parents: 295
diff changeset
155 do
3a2afc425ceb - Fix in peekNext(): need to skip comments.
aziz
parents: 295
diff changeset
156 lx.peek(next);
314
ebd21bbf296e - Added Whitespace, Sheband and Hashline to enum TOK. TOK.Whitespace is a flag and tokens that are considered whitespace are flagged as such.
aziz
parents: 313
diff changeset
157 while (next.isWhitespace) // Skip whitespace
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
158 return next.type;
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
159 }
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
160
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
161 TOK peekAfter(ref Token* next)
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
162 {
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
163 assert(next !is null);
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
164 do
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
165 lx.peek(next);
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
166 while (next.isWhitespace) // Skip whitespace
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
167 return next.type;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
168 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
169
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
170 /++++++++++++++++++++++++++++++
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
171 + Declaration parsing methods +
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
172 ++++++++++++++++++++++++++++++/
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
173
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
174 Declaration parseModuleDeclaration()
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
175 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
176 auto begin = token;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
177 ModuleFQN moduleFQN;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
178 do
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
179 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
180 nT();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
181 moduleFQN ~= requireId();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
182 } while (token.type == T.Dot)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
183 require(T.Semicolon);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
184 return set(new ModuleDeclaration(moduleFQN), begin);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
185 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
186
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
187 /++
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
188 DeclDefs:
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
189 DeclDef
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
190 DeclDefs
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
191 +/
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
192 Declaration[] parseDeclarationDefinitions()
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
193 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
194 Declaration[] decls;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
195 while (token.type != T.EOF)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
196 decls ~= parseDeclarationDefinition();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
197 return decls;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
198 }
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
199
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
200 /++
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
201 DeclDefsBlock:
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
202 { }
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
203 { DeclDefs }
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
204 +/
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
205 Declarations parseDeclarationDefinitionsBlock()
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
206 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
207 auto begin = token;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
208 auto decls = new Declarations;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
209 require(T.LBrace);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
210 while (token.type != T.RBrace && token.type != T.EOF)
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
211 decls ~= parseDeclarationDefinition();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
212 require(T.RBrace);
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
213 return set(decls, begin);
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
214 }
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
215
110
2fb631daaaae - Renamed methods.
aziz
parents: 109
diff changeset
216 Declaration parseDeclarationDefinition()
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
217 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
218 auto begin = token;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
219 Declaration decl;
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
220 switch (token.type)
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
221 {
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
222 case T.Align,
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
223 T.Pragma,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
224 // Protection attributes
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
225 T.Export,
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
226 T.Private,
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
227 T.Package,
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
228 T.Protected,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
229 T.Public:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
230 decl = parseAttributeSpecifier();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
231 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
232 // Storage classes
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
233 case T.Extern,
203
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
234 T.Deprecated,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
235 T.Override,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
236 T.Abstract,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
237 T.Synchronized,
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
238 //T.Static,
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
239 T.Final,
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
240 T.Const,
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
241 //T.Invariant, // D 2.0
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
242 T.Auto,
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
243 T.Scope:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
244 case_StaticAttribute:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
245 case_InvariantAttribute: // D 2.0
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
246 decl = parseStorageAttribute();
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
247 break;
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
248 case T.Alias:
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
249 nT();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
250 // TODO: parse StorageClasses?
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
251 decl = new AliasDeclaration(parseDeclaration());
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
252 break;
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
253 case T.Typedef:
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
254 nT();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
255 // TODO: parse StorageClasses?
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
256 decl = new TypedefDeclaration(parseDeclaration());
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
257 break;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
258 case T.Static:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
259 switch (peekNext())
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
260 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
261 case T.Import:
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
262 goto case_Import;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
263 case T.This:
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
264 decl = parseStaticConstructorDeclaration();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
265 break;
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
266 case T.Tilde:
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
267 decl = parseStaticDestructorDeclaration();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
268 break;
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
269 case T.If:
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
270 decl = parseStaticIfDeclaration();
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
271 break;
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
272 case T.Assert:
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
273 decl = parseStaticAssertDeclaration();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
274 break;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
275 default:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
276 goto case_StaticAttribute;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
277 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
278 break;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
279 case T.Import:
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
280 case_Import:
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
281 decl = parseImportDeclaration();
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
282 assert(decl && decl.kind == NodeKind.ImportDeclaration);
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
283 imports ~= cast(ImportDeclaration)cast(void*)decl;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
284 break;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
285 case T.Enum:
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
286 decl = parseEnumDeclaration();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
287 break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
288 case T.Class:
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
289 decl = parseClassDeclaration();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
290 break;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
291 case T.Interface:
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
292 decl = parseInterfaceDeclaration();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
293 break;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
294 case T.Struct, T.Union:
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
295 decl = parseAggregateDeclaration();
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
296 break;
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
297 case T.This:
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
298 decl = parseConstructorDeclaration();
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
299 break;
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
300 case T.Tilde:
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
301 decl = parseDestructorDeclaration();
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
302 break;
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
303 case T.Invariant:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
304 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
305 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
306 auto next = token;
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
307 if (peekAfter(next) == T.LParen)
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
308 {
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
309 if (peekAfter(next) != T.RParen)
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
310 goto case_Declaration;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
311 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
312 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
313 goto case_InvariantAttribute;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
314 }
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
315 decl = parseInvariantDeclaration();
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
316 break;
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
317 case T.Unittest:
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
318 decl = parseUnittestDeclaration();
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
319 break;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
320 case T.Debug:
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
321 decl = parseDebugDeclaration();
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
322 break;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
323 case T.Version:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
324 decl = parseVersionDeclaration();
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
325 break;
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
326 case T.Template:
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
327 decl = parseTemplateDeclaration();
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
328 break;
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
329 case T.New:
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
330 decl = parseNewDeclaration();
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
331 break;
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
332 case T.Delete:
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
333 decl = parseDeleteDeclaration();
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
334 break;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
335 case T.Mixin:
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
336 decl = parseMixin!(MixinDeclaration)();
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
337 break;
129
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
338 case T.Semicolon:
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
339 nT();
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
340 decl = new EmptyDeclaration();
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
341 break;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
342 // Declaration
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
343 case T.Identifier, T.Dot, T.Typeof:
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
344 // IntegralType
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
345 case T.Char, T.Wchar, T.Dchar, T.Bool,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
346 T.Byte, T.Ubyte, T.Short, T.Ushort,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
347 T.Int, T.Uint, T.Long, T.Ulong,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
348 T.Float, T.Double, T.Real,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
349 T.Ifloat, T.Idouble, T.Ireal,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
350 T.Cfloat, T.Cdouble, T.Creal, T.Void:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
351 case_Declaration:
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
352 return parseDeclaration();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
353 /+case T.Module:
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
354 // TODO: Error: module is optional and can appear only once at the top of the source file.
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
355 break;+/
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
356 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
357 error(MID.ExpectedButFound, "Declaration", token.srcText);
292
076152e945e0 - Added member Node[] children to class Node.
aziz
parents: 291
diff changeset
358 decl = new IllegalDeclaration(token);
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
359 nT();
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
360 }
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
361 set(decl, begin);
129
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
362 return decl;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
363 }
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
364
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
365 /*
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
366 DeclarationsBlock:
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
367 : DeclDefs
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
368 { }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
369 { DeclDefs }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
370 DeclDef
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
371 */
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
372 Declaration parseDeclarationsBlock(bool noColon = false)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
373 {
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
374 Declaration d;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
375 switch (token.type)
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
376 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
377 case T.LBrace:
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
378 d = parseDeclarationDefinitionsBlock();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
379 break;
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
380 case T.Colon:
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
381 if (noColon == true)
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
382 goto default;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
383 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
384 auto begin = token;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
385 auto decls = new Declarations;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
386 while (token.type != T.RBrace && token.type != T.EOF)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
387 decls ~= parseDeclarationDefinition();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
388 d = set(decls, begin);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
389 break;
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
390 default:
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
391 d = parseDeclarationDefinition();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
392 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
393 assert(isNodeSet(d));
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
394 return d;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
395 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
396
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
397 Declaration parseDeclarationsBlockNoColon()
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
398 {
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
399 return parseDeclarationsBlock(true);
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
400 }
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
401
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
402 /++
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
403 Parses either a VariableDeclaration or a FunctionDeclaration.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
404 Params:
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
405 stc = the previously parsed storage classes
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
406 optionalParameterList = a hint for how to parse C-style function pointers
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
407 +/
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
408 Declaration parseDeclaration(StorageClass stc = StorageClass.None, bool optionalParameterList = true)
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
409 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
410 auto begin = token;
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
411 Type type;
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
412 Token* ident;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
413
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
414 // Check for AutoDeclaration
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
415 if (stc != StorageClass.None &&
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
416 token.type == T.Identifier &&
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
417 peekNext() == T.Assign)
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
418 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
419 ident = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
420 nT();
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
421 }
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
422 else
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
423 {
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
424 type = parseType();
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
425 if (token.type == T.LParen)
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
426 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
427 // C-style function pointers make the grammar ambiguous.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
428 // We have to treat them specially at function scope.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
429 // Example:
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
430 // void foo() {
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
431 // // A pointer to a function taking an integer and returning 'some_type'.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
432 // some_type (*p_func)(int);
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
433 // // In the following case precedence is given to a CallExpression.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
434 // something(*p); // 'something' may be a function/method or an object having opCall overloaded.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
435 // }
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
436 // // A pointer to a function taking no parameters and returning 'something'.
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
437 // something(*p);
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
438 type = parseCFunctionPointerType(type, ident, optionalParameterList);
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
439 }
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
440 else
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
441 {
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
442 ident = requireId();
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
443 // Type FunctionName ( ParameterList ) FunctionBody
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
444 if (token.type == T.LParen)
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
445 {
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
446 // It's a function declaration
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
447 TemplateParameters tparams;
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
448 if (tokenAfterParenIs(T.LParen))
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
449 {
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
450 // ( TemplateParameterList ) ( ParameterList )
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
451 tparams = parseTemplateParameterList();
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
452 }
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
453
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
454 auto params = parseParameterList();
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
455 // ReturnType FunctionName ( ParameterList )
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
456 auto funcBody = parseFunctionBody();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
457 return set(new FunctionDeclaration(type, ident, tparams, params, funcBody), begin);
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
458 }
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
459 type = parseDeclaratorSuffix(type);
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
460 }
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
461 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
462
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
463 // It's a variable declaration.
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
464 Token*[] idents = [ident];
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
465 Expression[] values;
199
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
466 goto LenterLoop; // We've already parsed an identifier. Jump to if statement and check for initializer.
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
467 while (token.type == T.Comma)
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
468 {
222
4f31e4671e06 - Fix: nT() wasn't called in while loop to skip T.Comma.
aziz
parents: 220
diff changeset
469 nT();
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
470 idents ~= requireId();
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
471 LenterLoop:
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
472 if (token.type == T.Assign)
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
473 {
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
474 nT();
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
475 values ~= parseInitializer();
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
476 }
199
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
477 else
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
478 values ~= null;
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
479 }
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
480 require(T.Semicolon);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
481 return set(new VariableDeclaration(type, idents, values), begin);
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
482 }
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
483
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
484 Expression parseInitializer()
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
485 {
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
486 if (token.type == T.Void)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
487 {
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
488 auto begin = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
489 auto next = peekNext();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
490 if (next == T.Comma || next == T.Semicolon)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
491 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
492 nT();
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
493 return set(new VoidInitializer(), begin);
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
494 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
495 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
496 return parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
497 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
498
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
499 Expression parseNonVoidInitializer()
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
500 {
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
501 auto begin = token;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
502 Expression init;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
503 switch (token.type)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
504 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
505 case T.LBracket:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
506 // ArrayInitializer:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
507 // [ ]
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
508 // [ ArrayMemberInitializations ]
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
509 Expression[] keys;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
510 Expression[] values;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
511
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
512 nT();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
513 while (token.type != T.RBracket)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
514 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
515 auto e = parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
516 if (token.type == T.Colon)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
517 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
518 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
519 keys ~= e;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
520 values ~= parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
521 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
522 else
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
523 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
524 keys ~= null;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
525 values ~= e;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
526 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
527
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
528 if (token.type != T.Comma)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
529 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
530 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
531 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
532 require(T.RBracket);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
533 init = new ArrayInitializer(keys, values);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
534 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
535 case T.LBrace:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
536 // StructInitializer:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
537 // { }
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
538 // { StructMemberInitializers }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
539 Expression parseStructInitializer()
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
540 {
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
541 Token*[] idents;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
542 Expression[] values;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
543
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
544 nT();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
545 while (token.type != T.RBrace)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
546 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
547 if (token.type == T.Identifier)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
548 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
549 // Peek for colon to see if this is a member identifier.
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
550 if (peekNext() == T.Colon)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
551 {
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
552 idents ~= token;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
553 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
554 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
555 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
556 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
557 // NonVoidInitializer
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
558 values ~= parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
559
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
560 if (token.type != T.Comma)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
561 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
562 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
563 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
564 require(T.RBrace);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
565 return new StructInitializer(idents, values);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
566 }
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
567
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
568 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
569 auto si = try_(&parseStructInitializer, success);
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
570 if (success)
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
571 {
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
572 init = si;
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
573 break;
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
574 }
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
575 assert(token.type == T.LBrace);
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
576 //goto default;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
577 default:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
578 init = parseAssignExpression();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
579 }
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
580 set(init, begin);
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
581 return init;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
582 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
583
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
584 FunctionBody parseFunctionBody()
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
585 {
268
c19b68a4e3db - FunctionBody inherits from Node now.
aziz
parents: 267
diff changeset
586 auto begin = token;
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
587 auto func = new FunctionBody;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
588 while (1)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
589 {
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
590 switch (token.type)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
591 {
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
592 case T.LBrace:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
593 func.funcBody = parseStatements();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
594 break;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
595 case T.Semicolon:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
596 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
597 break;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
598 case T.In:
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
599 if (func.inBody)
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
600 error(MID.InContract);
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
601 nT();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
602 func.inBody = parseStatements();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
603 continue;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
604 case T.Out:
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
605 if (func.outBody)
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
606 error(MID.OutContract);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
607 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
608 if (token.type == T.LParen)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
609 {
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
610 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
611 func.outIdent = requireId();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
612 require(T.RParen);
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
613 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
614 func.outBody = parseStatements();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
615 continue;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
616 case T.Body:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
617 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
618 goto case T.LBrace;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
619 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
620 error(MID.ExpectedButFound, "FunctionBody", token.srcText);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
621 }
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
622 break; // Exit loop.
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
623 }
268
c19b68a4e3db - FunctionBody inherits from Node now.
aziz
parents: 267
diff changeset
624 set(func, begin);
299
559d5d62e0c1 - Added checks for null before adding member to Node.children.
aziz
parents: 298
diff changeset
625 func.finishConstruction();
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
626 return func;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
627 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
628
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
629 Linkage parseLinkage()
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
630 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
631 if (token.type != T.LParen)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
632 return null;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
633
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
634 nT(); // Skip (
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
635 if (token.type == T.RParen)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
636 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
637 error(MID.MissingLinkageType);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
638 nT();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
639 return null;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
640 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
641
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
642 auto begin = token;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
643 auto ident = requireId();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
644
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
645 Linkage.Type linktype;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
646 switch (ident ? ident.identifier : null)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
647 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
648 case "C":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
649 if (token.type == T.PlusPlus)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
650 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
651 nT();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
652 linktype = Linkage.Type.Cpp;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
653 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
654 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
655 linktype = Linkage.Type.C;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
656 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
657 case "D":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
658 linktype = Linkage.Type.D;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
659 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
660 case "Windows":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
661 linktype = Linkage.Type.Windows;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
662 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
663 case "Pascal":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
664 linktype = Linkage.Type.Pascal;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
665 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
666 case "System":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
667 linktype = Linkage.Type.System;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
668 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
669 default:
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
670 error(MID.UnrecognizedLinkageType, token.srcText);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
671 nT();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
672 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
673 auto linkage = new Linkage(linktype);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
674 set(linkage, begin);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
675 require(T.RParen);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
676 return linkage;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
677 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
678
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
679 Declaration parseStorageAttribute()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
680 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
681 StorageClass stc, tmp;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
682 Linkage.Category link_cat;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
683
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
684 void addStorageClass()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
685 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
686 if (stc & tmp)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
687 error(MID.RedundantStorageClass, token.srcText);
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
688 else
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
689 stc |= tmp;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
690 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
691
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
692 Declaration parse()
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
693 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
694 Declaration decl;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
695 auto begin = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
696 switch (token.type)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
697 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
698 case T.Extern:
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
699 stc |= StorageClass.Extern;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
700 nT();
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
701 Linkage linkage = parseLinkage();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
702
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
703 // Check for redundancy.
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
704 Linkage.Category link_cat_tmp = Linkage.getCategory(linkage);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
705 if (link_cat & link_cat_tmp)
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
706 {
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
707 char[] srcText = begin.srcText;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
708 if (link_cat_tmp == Linkage.Category.MangleSymbol)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
709 srcText = begin.start[0 .. prevToken.end - begin.start];
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
710 error(MID.RedundantStorageClass, srcText);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
711 }
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
712 else
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
713 link_cat |= link_cat_tmp;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
714
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
715 decl = set(new ExternDeclaration(linkage, parse()), begin);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
716 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
717 case T.Override:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
718 tmp = StorageClass.Override;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
719 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
720 case T.Deprecated:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
721 tmp = StorageClass.Deprecated;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
722 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
723 case T.Abstract:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
724 tmp = StorageClass.Abstract;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
725 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
726 case T.Synchronized:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
727 tmp = StorageClass.Synchronized;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
728 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
729 case T.Static:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
730 tmp = StorageClass.Static;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
731 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
732 case T.Final:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
733 tmp = StorageClass.Final;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
734 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
735 case T.Const:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
736 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
737 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
738 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
739 goto case_Declaration;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
740 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
741 tmp = StorageClass.Const;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
742 goto Lcommon;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
743 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
744 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
745 case T.Invariant: // D 2.0
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
746 // TODO: could this be a class invariant?
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
747 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
748 goto case_Declaration;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
749 tmp = StorageClass.Invariant;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
750 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
751 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
752 case T.Auto:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
753 tmp = StorageClass.Auto;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
754 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
755 case T.Scope:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
756 tmp = StorageClass.Scope;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
757 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
758 Lcommon:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
759 addStorageClass();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
760 auto tok = token.type;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
761 nT();
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
762 decl = set(new AttributeDeclaration(tok, parse()), begin);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
763 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
764 case T.Identifier:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
765 case_Declaration:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
766 // This could be a normal Declaration or an AutoDeclaration
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
767 decl = parseDeclaration(stc);
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
768 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
769 default:
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
770 decl = parseDeclarationsBlock();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
771 }
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
772 return decl;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
773 }
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
774 return parse();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
775 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
776
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
777 Token* parseAlignAttribute()
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
778 {
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
779 assert(token.type == T.Align);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
780 nT(); // Skip align keyword.
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
781 Token* tok;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
782 if (token.type == T.LParen)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
783 {
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
784 nT();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
785 if (token.type == T.Int32)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
786 {
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
787 tok = token;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
788 nT();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
789 }
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
790 else
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
791 expected(T.Int32);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
792 require(T.RParen);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
793 }
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
794 return tok;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
795 }
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
796
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
797 Declaration parseAttributeSpecifier()
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
798 {
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
799 Declaration decl;
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
800
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
801 switch (token.type)
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
802 {
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
803 case T.Align:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
804 int size = -1;
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
805 auto intTok = parseAlignAttribute();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
806 if (intTok)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
807 size = intTok.int_;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
808 decl = new AlignDeclaration(size, parseDeclarationsBlock());
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
809 break;
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
810 case T.Pragma:
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
811 // Pragma:
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
812 // pragma ( Identifier )
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
813 // pragma ( Identifier , ExpressionList )
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
814 nT();
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
815 Token* ident;
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
816 Expression[] args;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
817 Declaration decls;
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
818
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
819 require(T.LParen);
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
820 ident = requireId();
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
821
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
822 if (token.type == T.Comma)
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
823 {
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
824 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
825 args = parseExpressionList();
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
826 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
827 require(T.RParen);
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
828
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
829 if (token.type == T.Semicolon)
313
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
830 {
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
831 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
832 // TODO: call set()?
313
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
833 decls = new EmptyDeclaration();
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
834 }
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
835 else
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
836 decls = parseDeclarationsBlock();
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
837
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
838 decl = new PragmaDeclaration(ident, args, decls);
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
839 break;
149
37e2e0d06013 - Removed ProtectionDeclaration.
aziz
parents: 148
diff changeset
840 // Protection attributes
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
841 case T.Private:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
842 case T.Package:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
843 case T.Protected:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
844 case T.Public:
148
e3e4d3314166 - Implemented parsing protection attributes.
aziz
parents: 147
diff changeset
845 case T.Export:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
846 auto tok = token.type;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
847 nT();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
848 decl = new AttributeDeclaration(tok, parseDeclarationsBlock());
149
37e2e0d06013 - Removed ProtectionDeclaration.
aziz
parents: 148
diff changeset
849 break;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
850 default:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
851 assert(0);
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
852 }
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
853 return decl;
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
854 }
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
855
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
856 Declaration parseImportDeclaration()
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
857 {
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
858 assert(token.type == T.Import || token.type == T.Static);
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
859
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
860 bool isStatic;
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
861
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
862 if (token.type == T.Static)
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
863 {
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
864 isStatic = true;
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
865 nT();
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
866 }
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
867
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
868 assert(token.type == T.Import);
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
869
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
870 ModuleFQN[] moduleFQNs;
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
871 Token*[] moduleAliases;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
872 Token*[] bindNames;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
873 Token*[] bindAliases;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
874
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
875 nT(); // Skip import keyword.
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
876 while (1)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
877 {
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
878 ModuleFQN moduleFQN;
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
879 Token* moduleAlias;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
880
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
881 moduleAlias = requireId();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
882
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
883 // AliasName = ModuleName
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
884 if (token.type == T.Assign)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
885 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
886 nT();
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
887 moduleFQN ~= requireId();
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
888 }
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
889 else // import Identifier [^=]
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
890 {
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
891 moduleFQN ~= moduleAlias;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
892 moduleAlias = null;
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
893 }
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
894
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
895 // Identifier(.Identifier)*
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
896 while (token.type == T.Dot)
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
897 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
898 nT();
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
899 moduleFQN ~= requireId();
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
900 }
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
901
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
902 // Push identifiers.
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
903 moduleFQNs ~= moduleFQN;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
904 moduleAliases ~= moduleAlias;
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
905
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
906 if (token.type != T.Comma)
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
907 break;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
908 nT();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
909 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
910
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
911 if (token.type == T.Colon)
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
912 {
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
913 // BindAlias = BindName(, BindAlias = BindName)*;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
914 // BindName(, BindName)*;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
915 Token* bindName, bindAlias;
320
0ce14640eb04 - Fix in parseImportDeclaration(): rewrote while loop and removed a call to nT().
aziz
parents: 319
diff changeset
916 do
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
917 {
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
918 nT();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
919 bindAlias = requireId();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
920
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
921 if (token.type == T.Assign)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
922 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
923 nT();
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
924 bindName = requireId();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
925 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
926 else
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
927 {
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
928 bindName = bindAlias;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
929 bindAlias = null;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
930 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
931
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
932 // Push identifiers.
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
933 bindNames ~= bindName;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
934 bindAliases ~= bindAlias;
320
0ce14640eb04 - Fix in parseImportDeclaration(): rewrote while loop and removed a call to nT().
aziz
parents: 319
diff changeset
935 } while (token.type == T.Comma)
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
936 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
937
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
938 require(T.Semicolon);
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
939
366
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 364
diff changeset
940 return new ImportDeclaration(moduleFQNs, moduleAliases, bindNames, bindAliases, isStatic);
103
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
941 }
511a1aa25896 - Added reportErrors member to Lexer. Moved peek() down and rewrote it a bit making use of reportErrors. error() uses reportErrors too.
aziz
parents: 102
diff changeset
942
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
943 Declaration parseEnumDeclaration()
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
944 {
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
945 assert(token.type == T.Enum);
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
946
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
947 Token* enumName;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
948 Type baseType;
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
949 EnumMember[] members;
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
950 bool hasBody;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
951
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
952 nT(); // Skip enum keyword.
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
953
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
954 if (token.type == T.Identifier)
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
955 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
956 enumName = token;
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
957 nT();
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
958 }
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
959
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
960 if (token.type == T.Colon)
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
961 {
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
962 nT();
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
963 baseType = parseBasicType();
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
964 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
965
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
966 if (token.type == T.Semicolon)
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
967 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
968 if (enumName is null)
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
969 expected(T.Identifier);
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
970 nT();
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
971 }
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
972 else if (token.type == T.LBrace)
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
973 {
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
974 hasBody = true;
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
975 nT(); // Skip {
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
976 while (token.type != T.RBrace)
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
977 {
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
978 auto begin = token;
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
979 auto memberName = requireId();
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
980 Expression value;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
981
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
982 if (token.type == T.Assign)
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
983 {
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
984 nT();
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
985 value = parseAssignExpression();
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
986 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
987 else
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
988 value = null;
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
989
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
990 members ~= set(new EnumMember(memberName, value), begin);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
991
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
992 if (token.type != T.Comma)
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
993 break;
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
994 nT(); // Skip ,
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
995 }
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
996 require(T.RBrace);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
997 }
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
998 else
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
999 error(MID.ExpectedButFound, "enum declaration", token.srcText);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1000
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1001 return new EnumDeclaration(enumName, baseType, members, hasBody);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1002 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1003
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1004 Declaration parseClassDeclaration()
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1005 {
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1006 assert(token.type == T.Class);
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1007
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1008 Token* className;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1009 TemplateParameters tparams;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1010 BaseClass[] bases;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1011 Declarations decls;
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1012 bool hasBody;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1013
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1014 nT(); // Skip class keyword.
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1015 className = requireId();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1016
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1017 if (token.type == T.LParen)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1018 {
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1019 tparams = parseTemplateParameterList();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1020 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1021
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1022 if (token.type == T.Colon)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1023 bases = parseBaseClasses();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1024
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1025 if (token.type == T.Semicolon)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1026 {
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1027 if (bases.length != 0)
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1028 error(MID.BaseClassInForwardDeclaration);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1029 nT();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1030 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1031 else if (token.type == T.LBrace)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1032 {
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1033 hasBody = true;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1034 decls = parseDeclarationDefinitionsBlock();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1035 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1036 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1037 expected(T.LBrace); // TODO: better error msg
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1038
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1039 return new ClassDeclaration(className, tparams, bases, decls, hasBody);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1040 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1041
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1042 BaseClass[] parseBaseClasses(bool colonLeadsOff = true)
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1043 {
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1044 if (colonLeadsOff)
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1045 {
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1046 assert(token.type == T.Colon);
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1047 nT(); // Skip colon
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1048 }
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1049
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1050 BaseClass[] bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1051
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1052 while (1)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1053 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1054 Protection prot = Protection.Public;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1055 switch (token.type)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1056 {
204
082f30904456 - Allowing 'typeof' in BaseClassList.
aziz
parents: 203
diff changeset
1057 case T.Identifier, T.Dot, T.Typeof: goto LparseBasicType;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1058 case T.Private: prot = Protection.Private; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1059 case T.Protected: prot = Protection.Protected; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1060 case T.Package: prot = Protection.Package; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1061 case T.Public: /*prot = Protection.Public;*/ break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1062 default:
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1063 error(MID.ExpectedBaseClasses, token.srcText);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1064 return bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1065 }
158
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1066 nT(); // Skip protection attribute.
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1067 LparseBasicType:
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1068 auto begin = token;
158
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1069 auto type = parseBasicType();
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1070 //if (type.tid != TID.DotList)
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1071 // TODO: issue error msg. base classes can only be one or more identifiers or template instances separated by dots.
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1072 bases ~= set(new BaseClass(prot, type), begin);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1073 if (token.type != T.Comma)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1074 break;
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
1075 nT();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1076 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1077 return bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1078 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1079
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1080 Declaration parseInterfaceDeclaration()
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1081 {
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1082 assert(token.type == T.Interface);
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1083
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1084 Token* name;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1085 TemplateParameters tparams;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1086 BaseClass[] bases;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1087 Declarations decls;
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1088 bool hasBody;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1089
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1090 nT(); // Skip interface keyword.
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1091 name = requireId();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1092
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1093 if (token.type == T.LParen)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1094 {
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1095 tparams = parseTemplateParameterList();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1096 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1097
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1098 if (token.type == T.Colon)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1099 bases = parseBaseClasses();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1100
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1101 if (token.type == T.Semicolon)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1102 {
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1103 if (bases.length != 0)
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1104 error(MID.BaseClassInForwardDeclaration);
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1105 nT();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1106 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1107 else if (token.type == T.LBrace)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1108 {
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1109 hasBody = true;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1110 decls = parseDeclarationDefinitionsBlock();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1111 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1112 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1113 expected(T.LBrace); // TODO: better error msg
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1114
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1115 return new InterfaceDeclaration(name, tparams, bases, decls, hasBody);
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1116 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1117
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1118 Declaration parseAggregateDeclaration()
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1119 {
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1120 assert(token.type == T.Struct || token.type == T.Union);
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1121
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1122 TOK tok = token.type;
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1123
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1124 Token* name;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1125 TemplateParameters tparams;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1126 Declarations decls;
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1127 bool hasBody;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1128
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1129 nT(); // Skip struct or union keyword.
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1130 // name is optional.
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1131 if (token.type == T.Identifier)
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1132 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1133 name = token;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1134 nT();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1135 if (token.type == T.LParen)
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1136 {
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1137 tparams = parseTemplateParameterList();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1138 }
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1139 }
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1140
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1141 if (token.type == T.Semicolon)
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1142 {
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1143 //if (name.length == 0)
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1144 // TODO: error: forward declarations must have a name.
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1145 nT();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1146 }
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1147 else if (token.type == T.LBrace)
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1148 {
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1149 hasBody = true;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1150 decls = parseDeclarationDefinitionsBlock();
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1151 }
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1152 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1153 expected(T.LBrace); // TODO: better error msg
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1154
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1155 if (tok == T.Struct)
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1156 return new StructDeclaration(name, tparams, decls, hasBody);
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1157 else
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1158 return new UnionDeclaration(name, tparams, decls, hasBody);
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1159 }
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1160
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1161 Declaration parseConstructorDeclaration()
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1162 {
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1163 assert(token.type == T.This);
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1164 nT(); // Skip 'this' keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1165 auto parameters = parseParameterList();
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1166 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1167 return new ConstructorDeclaration(parameters, funcBody);
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1168 }
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1169
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1170 Declaration parseDestructorDeclaration()
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1171 {
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1172 assert(token.type == T.Tilde);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1173 nT(); // Skip ~
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1174 require(T.This);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1175 require(T.LParen);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1176 require(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1177 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1178 return new DestructorDeclaration(funcBody);
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1179 }
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1180
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1181 Declaration parseStaticConstructorDeclaration()
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1182 {
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1183 assert(token.type == T.Static);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1184 nT(); // Skip static keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1185 nT(); // Skip 'this' keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1186 require(T.LParen);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1187 require(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1188 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1189 return new StaticConstructorDeclaration(funcBody);
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1190 }
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1191
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1192 Declaration parseStaticDestructorDeclaration()
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1193 {
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1194 assert(token.type == T.Static);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1195 nT(); // Skip static keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1196 nT(); // Skip ~
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1197 require(T.This);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1198 require(T.LParen);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1199 require(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1200 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1201 return new StaticDestructorDeclaration(funcBody);
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1202 }
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1203
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1204 Declaration parseInvariantDeclaration()
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1205 {
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1206 assert(token.type == T.Invariant);
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1207 nT(); // Skip invariant keyword.
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1208 // Optional () for getting ready porting to D 2.0
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1209 if (token.type == T.LParen)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1210 requireNext(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1211 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1212 return new InvariantDeclaration(funcBody);
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1213 }
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1214
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1215 Declaration parseUnittestDeclaration()
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1216 {
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1217 assert(token.type == T.Unittest);
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1218
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1219 nT(); // Skip unittest keyword.
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1220 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1221 return new UnittestDeclaration(funcBody);
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1222 }
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1223
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1224 Declaration parseDebugDeclaration()
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1225 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1226 assert(token.type == T.Debug);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1227
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1228 nT(); // Skip debug keyword.
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1229
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1230 Token* spec; // debug = Integer ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1231 // debug = Identifier ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1232 Token* cond; // debug ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1233 // debug ( Identifier )
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1234 Declaration decls, elseDecls;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1235
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1236 void parseIdentOrInt(ref Token* tok)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1237 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1238 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1239 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1240 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1241 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1242 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1243 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1244 }
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1245 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1246 expected(T.Identifier); // TODO: better error msg
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1247 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1248
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1249 if (token.type == T.Assign)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1250 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1251 parseIdentOrInt(spec);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1252 require(T.Semicolon);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1253 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1254 else
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1255 {
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1256 // Condition:
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1257 // Integer
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1258 // Identifier
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1259 // ( Condition )
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1260 if (token.type == T.LParen)
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1261 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1262 parseIdentOrInt(cond);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1263 require(T.RParen);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1264 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1265
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1266 // debug DeclarationsBlock
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1267 // debug ( Condition ) DeclarationsBlock
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1268 decls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1269
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1270 // else DeclarationsBlock
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1271 if (token.type == T.Else)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1272 {
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1273 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1274 elseDecls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1275 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1276 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1277
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1278 return new DebugDeclaration(spec, cond, decls, elseDecls);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1279 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1280
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1281 Declaration parseVersionDeclaration()
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1282 {
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1283 assert(token.type == T.Version);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1284
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1285 nT(); // Skip version keyword.
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1286
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1287 Token* spec; // version = Integer ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1288 // version = Identifier ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1289 Token* cond; // version ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1290 // version ( Identifier )
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1291 Declaration decls, elseDecls;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1292
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1293 void parseIdentOrInt(ref Token* tok)
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1294 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1295 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1296 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1297 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1298 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1299 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1300 }
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1301 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1302 expected(T.Identifier); // TODO: better error msg
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1303 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1304
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1305 if (token.type == T.Assign)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1306 {
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1307 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1308 parseIdentOrInt(spec);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1309 require(T.Semicolon);
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1310 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1311 else
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1312 {
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1313 // Condition:
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1314 // Integer
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1315 // Identifier
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1316
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1317 // ( Condition )
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1318 require(T.LParen);
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1319 parseIdentOrInt(cond);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1320 require(T.RParen);
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1321
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1322 // version ( Condition ) DeclarationsBlock
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1323 decls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1324
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1325 // else DeclarationsBlock
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1326 if (token.type == T.Else)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1327 {
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1328 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1329 elseDecls = parseDeclarationsBlockNoColon();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1330 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1331 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1332
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1333 return new VersionDeclaration(spec, cond, decls, elseDecls);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1334 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1335
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1336 Declaration parseStaticIfDeclaration()
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1337 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1338 assert(token.type == T.Static);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1339
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1340 nT(); // Skip static keyword.
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1341 nT(); // Skip if keyword.
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1342
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1343 Expression condition;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1344 Declaration ifDecls, elseDecls;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1345
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1346 require(T.LParen);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1347 condition = parseAssignExpression();
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1348 require(T.RParen);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1349
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1350 ifDecls = parseDeclarationsBlockNoColon();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1351
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1352 if (token.type == T.Else)
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1353 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1354 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1355 elseDecls = parseDeclarationsBlockNoColon();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1356 }
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1357
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1358 return new StaticIfDeclaration(condition, ifDecls, elseDecls);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1359 }
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1360
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1361 Declaration parseStaticAssertDeclaration()
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1362 {
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1363 assert(token.type == T.Static);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1364
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1365 nT(); // Skip static keyword.
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1366 nT(); // Skip assert keyword.
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1367
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1368 Expression condition, message;
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1369
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1370 require(T.LParen);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1371
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1372 condition = parseAssignExpression();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1373
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1374 if (token.type == T.Comma)
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1375 {
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1376 nT();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1377 message = parseAssignExpression();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1378 }
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1379
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1380 require(T.RParen);
128
e02b87281b4e - Static asserts have to end with a semicolon.
aziz
parents: 127
diff changeset
1381 require(T.Semicolon);
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1382
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1383 return new StaticAssertDeclaration(condition, message);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1384 }
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1385
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1386 Declaration parseTemplateDeclaration()
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1387 {
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1388 assert(token.type == T.Template);
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1389 nT(); // Skip template keyword.
265
3a2a0a63c638 - Changed some string types to Token*.
aziz
parents: 264
diff changeset
1390 auto templateName = requireId();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1391 auto templateParams = parseTemplateParameterList();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1392 auto decls = parseDeclarationDefinitionsBlock();
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1393 return new TemplateDeclaration(templateName, templateParams, decls);
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1394 }
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1395
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1396 Declaration parseNewDeclaration()
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1397 {
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1398 assert(token.type == T.New);
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1399 nT(); // Skip new keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1400 auto parameters = parseParameterList();
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1401 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1402 return new NewDeclaration(parameters, funcBody);
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1403 }
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1404
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1405 Declaration parseDeleteDeclaration()
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1406 {
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1407 assert(token.type == T.Delete);
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1408 nT(); // Skip delete keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1409 auto parameters = parseParameterList();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1410 // TODO: only one parameter of type void* allowed. Check in parsing or semantic phase?
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1411 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1412 return new DeleteDeclaration(parameters, funcBody);
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1413 }
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1414
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1415 /+
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1416 DotListExpression:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1417 . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1418 DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1419 Typeof
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1420 Typeof . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1421 DotListItems:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1422 DotListItem
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1423 DotListItem . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1424 DotListItem:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1425 Identifier
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1426 TemplateInstance
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1427 NewExpression
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1428 TemplateInstance:
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1429 Identifier !( TemplateArguments )
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1430 +/
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1431 DotListExpression parseDotListExpression()
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1432 {
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1433 assert(token.type == T.Identifier || token.type == T.Dot || token.type == T.Typeof);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1434 auto begin = token;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1435 Expression[] identList;
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1436 if (token.type == T.Dot)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1437 {
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1438 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1439 identList ~= set(new DotExpression(), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1440 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1441 else if (token.type == T.Typeof)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1442 {
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1443 requireNext(T.LParen);
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1444 auto type = new TypeofType(parseExpression());
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1445 require(T.RParen);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1446 set(type, begin);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1447 identList ~= set(new TypeofExpression(type), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1448 if (token.type != T.Dot)
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1449 goto Lreturn;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1450 nT();
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1451 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1452
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1453 while (1)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1454 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1455 begin = token;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1456 auto ident = requireId();
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1457 Expression e;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1458 if (token.type == T.Not && peekNext() == T.LParen) // Identifier !( TemplateArguments )
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1459 {
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1460 nT(); // Skip !.
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1461 e = set(new TemplateInstanceExpression(ident, parseTemplateArguments()), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1462 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1463 else // Identifier
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1464 e = set(new IdentifierExpression(ident), begin);
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1465
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1466 identList ~= e;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1467
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1468 LnewExpressionLoop:
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1469 if (token.type != T.Dot)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1470 break;
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1471 nT(); // Skip dot.
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1472
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1473 if (token.type == T.New)
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1474 {
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1475 identList ~= parseNewExpression();
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1476 goto LnewExpressionLoop;
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1477 }
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1478 }
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1479
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1480 Lreturn:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1481 return new DotListExpression(identList);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1482 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1483
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1484 /+
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1485 DotListType:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1486 . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1487 TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1488 Typeof
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1489 Typeof . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1490 TypeItems:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1491 TypeItem
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1492 TypeItem . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1493 TypeItem:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1494 Identifier
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1495 TemplateInstance
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1496 TemplateInstance:
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1497 Identifier !( TemplateArguments )
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1498 +/
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1499 DotListType parseDotListType()
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1500 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1501 auto begin = token;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1502 Type[] identList;
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1503 if (token.type == T.Dot)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1504 {
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1505 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1506 identList ~= set(new DotType(), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1507 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1508 else if (token.type == T.Typeof)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1509 {
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1510 requireNext(T.LParen);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1511 auto type = new TypeofType(parseExpression());
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1512 require(T.RParen);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1513 identList ~= set(type, begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1514 if (token.type != T.Dot)
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1515 goto Lreturn;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1516 nT();
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1517 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1518
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1519 while (1)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1520 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1521 begin = token;
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1522 auto ident = requireId();
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1523 // NB.: Currently Types can't be followed by "!=" so we don't need to peek for "(" when parsing TemplateInstances.
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1524 if (token.type == T.Not/+ && peekNext() == T.LParen+/) // Identifier !( TemplateArguments )
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1525 {
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1526 nT(); // Skip !.
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1527 identList ~= set(new TemplateInstanceType(ident, parseTemplateArguments()), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1528 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1529 else // Identifier
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1530 identList ~= set(new IdentifierType(ident), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1531
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1532 if (token.type != T.Dot)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1533 break;
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1534 nT();
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1535 }
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1536 Lreturn:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1537 return new DotListType(identList);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1538 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1539
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1540 /*
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1541 TemplateMixin:
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1542 mixin ( AssignExpression ) ;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1543 mixin TemplateIdentifier ;
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1544 mixin TemplateIdentifier MixinIdentifier ;
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1545 mixin TemplateIdentifier !( TemplateArguments ) ;
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1546 mixin TemplateIdentifier !( TemplateArguments ) MixinIdentifier ;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1547 */
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1548 Class parseMixin(Class)()
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1549 {
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1550 assert(token.type == T.Mixin);
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1551 auto begin = token;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1552 nT(); // Skip mixin keyword.
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1553
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1554 static if (is(Class == MixinDeclaration))
301
caef255a2801 - Fix in some ctors: adding only non-null members to this.children.
aziz
parents: 299
diff changeset
1555 {
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1556 if (token.type == T.LParen)
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1557 {
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1558 // TODO: What about mixin(...).ident;?
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1559 nT();
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1560 auto e = parseAssignExpression();
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1561 require(T.RParen);
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1562 require(T.Semicolon);
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1563 return new MixinDeclaration(e);
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1564 }
301
caef255a2801 - Fix in some ctors: adding only non-null members to this.children.
aziz
parents: 299
diff changeset
1565 }
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1566
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1567 Expression[] templateIdent;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1568 Token* mixinIdent;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1569
159
5aa877506db0 - Added enum Linkage.
aziz
parents: 158
diff changeset
1570 // This code is similar to parseDotListType().
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1571 if (token.type == T.Dot)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1572 {
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1573 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1574 templateIdent ~= set(new DotExpression(), begin);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1575 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1576
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1577 while (1)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1578 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1579 begin = token;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1580 auto ident = requireId();
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1581 Expression e;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1582 if (token.type == T.Not) // Identifier !( TemplateArguments )
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1583 {
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1584 // No need to peek for T.LParen. This must be a template instance.
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1585 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1586 e = set(new TemplateInstanceExpression(ident, parseTemplateArguments()), begin);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1587 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1588 else // Identifier
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1589 e = set(new IdentifierExpression(ident), begin);
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1590
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1591 templateIdent ~= e;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1592
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1593 if (token.type != T.Dot)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1594 break;
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1595 nT();
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1596 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1597
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1598 if (token.type == T.Identifier)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1599 {
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1600 mixinIdent = token;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1601 nT();
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1602 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1603
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1604 require(T.Semicolon);
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1605
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1606 return new Class(templateIdent, mixinIdent);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1607 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1608
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
1609 /+++++++++++++++++++++++++++++
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1610 + Statement parsing methods +
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1611 +++++++++++++++++++++++++++++/
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1612
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1613 Statements parseStatements()
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1614 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1615 auto begin = token;
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
1616 require(T.LBrace);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1617 auto statements = new Statements();
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1618 while (token.type != T.RBrace && token.type != T.EOF)
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1619 statements ~= parseStatement();
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
1620 require(T.RBrace);
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1621 return set(statements, begin);
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1622 }
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1623
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1624 Statement parseStatement()
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1625 {
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1626 auto begin = token;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1627 Statement s;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1628 Declaration d;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1629 switch (token.type)
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1630 {
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1631 case T.Align:
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1632 int size = -1;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1633 auto intTok = parseAlignAttribute();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1634 if (intTok)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1635 size = intTok.int_;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1636 // Restrict align attribute to structs in parsing phase.
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1637 Declaration structDecl;
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1638 if (token.type == T.Struct)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1639 structDecl = parseAggregateDeclaration();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1640 else
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1641 expected(T.Struct);
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1642 d = new AlignDeclaration(size, structDecl ? structDecl : new Declarations);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1643 goto LreturnDeclarationStatement;
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1644 /+ Not applicable for statements.
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1645 // T.Private,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1646 // T.Package,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1647 // T.Protected,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1648 // T.Public,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1649 // T.Export,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1650 // T.Deprecated,
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1651 // T.Override,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1652 // T.Abstract,
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1653 +/
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1654 case T.Extern,
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1655 T.Final,
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1656 T.Const,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1657 T.Auto:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1658 //T.Scope
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1659 //T.Static
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1660 case_parseAttribute:
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1661 s = parseAttributeStatement();
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1662 return s;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1663 case T.Identifier:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1664 if (peekNext() == T.Colon)
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1665 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1666 auto ident = token;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1667 nT(); // Skip Identifier
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1668 nT(); // Skip :
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1669 s = new LabeledStatement(ident, parseNoScopeOrEmptyStatement());
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1670 break;
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1671 }
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1672 goto case T.Dot;
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1673 case T.Dot, T.Typeof:
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
1674 bool success;
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1675 d = try_({return parseDeclaration(StorageClass.None, false);}, success);
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
1676 if (success)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1677 goto LreturnDeclarationStatement; // Declaration
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1678 else
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1679 goto case_parseExpressionStatement; // Expression
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1680 // IntegralType
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1681 case T.Char, T.Wchar, T.Dchar, T.Bool,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1682 T.Byte, T.Ubyte, T.Short, T.Ushort,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1683 T.Int, T.Uint, T.Long, T.Ulong,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1684 T.Float, T.Double, T.Real,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1685 T.Ifloat, T.Idouble, T.Ireal,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1686 T.Cfloat, T.Cdouble, T.Creal, T.Void:
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1687 case_parseDeclaration:
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1688 d = parseDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1689 goto LreturnDeclarationStatement;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1690 case T.If:
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1691 s = parseIfStatement();
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1692 break;
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1693 case T.While:
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1694 s = parseWhileStatement();
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1695 break;
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1696 case T.Do:
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1697 s = parseDoWhileStatement();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1698 break;
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1699 case T.For:
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1700 s = parseForStatement();
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1701 break;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1702 case T.Foreach, T.Foreach_reverse:
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1703 s = parseForeachStatement();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1704 break;
170
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1705 case T.Switch:
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1706 s = parseSwitchStatement();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1707 break;
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1708 case T.Case:
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1709 s = parseCaseStatement();
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1710 break;
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1711 case T.Default:
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1712 s = parseDefaultStatement();
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1713 break;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1714 case T.Continue:
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1715 s = parseContinueStatement();
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1716 break;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1717 case T.Break:
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1718 s = parseBreakStatement();
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1719 break;
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1720 case T.Return:
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1721 s = parseReturnStatement();
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1722 break;
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1723 case T.Goto:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1724 s = parseGotoStatement();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1725 break;
177
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1726 case T.With:
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1727 s = parseWithStatement();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1728 break;
178
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1729 case T.Synchronized:
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1730 s = parseSynchronizedStatement();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1731 break;
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1732 case T.Try:
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1733 s = parseTryStatement();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1734 break;
180
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1735 case T.Throw:
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1736 s = parseThrowStatement();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1737 break;
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1738 case T.Scope:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1739 if (peekNext() != T.LParen)
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1740 goto case_parseAttribute;
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1741 s = parseScopeGuardStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1742 break;
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1743 case T.Volatile:
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1744 s = parseVolatileStatement();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1745 break;
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1746 case T.Asm:
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1747 s = parseAsmStatement();
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1748 break;
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1749 case T.Pragma:
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1750 s = parsePragmaStatement();
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1751 break;
185
35c93b776be0 - Added code for parsing MixinStatements.
aziz
parents: 184
diff changeset
1752 case T.Mixin:
246
52f4aa097865 - Fix: parse mixin as expression instead of statement when next token is T.LParen.
aziz
parents: 245
diff changeset
1753 if (peekNext() == T.LParen)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1754 goto case_parseExpressionStatement; // Parse as expression.
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1755 s = parseMixin!(MixinStatement)();
185
35c93b776be0 - Added code for parsing MixinStatements.
aziz
parents: 184
diff changeset
1756 break;
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1757 case T.Static:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1758 switch (peekNext())
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1759 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1760 case T.If:
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1761 s = parseStaticIfStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1762 break;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1763 case T.Assert:
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1764 s = parseStaticAssertStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1765 break;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1766 default:
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1767 goto case_parseAttribute;
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1768 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1769 break;
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1770 case T.Debug:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1771 s = parseDebugStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1772 break;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1773 case T.Version:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1774 s = parseVersionStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1775 break;
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1776 // DeclDef
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1777 case T.Alias, T.Typedef:
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1778 d = parseDeclarationDefinition();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1779 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1780 case T.Enum:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1781 d = parseEnumDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1782 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1783 case T.Class:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1784 d = parseClassDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1785 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1786 case T.Interface:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1787 d = parseInterfaceDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1788 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1789 case T.Struct, T.Union:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1790 d = parseAggregateDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1791 // goto LreturnDeclarationStatement;
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1792 LreturnDeclarationStatement:
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1793 set(d, begin);
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1794 s = new DeclarationStatement(d);
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1795 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1796 case T.LBrace:
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1797 s = parseScopeStatement();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1798 break;
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1799 case T.Semicolon:
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1800 nT();
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1801 s = new EmptyStatement();
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1802 break;
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1803 /+
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1804 Parse ExpressionStatement:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1805 +/
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1806 // Tokens that start a PrimaryExpression.
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1807 // case T.Identifier, T.Dot, T.Typeof:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1808 case T.This:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1809 case T.Super:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1810 case T.Null:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1811 case T.True, T.False:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1812 // case T.Dollar:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1813 case T.Int32, T.Int64, T.Uint32, T.Uint64:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1814 case T.Float32, T.Float64, T.Float80,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1815 T.Imaginary32, T.Imaginary64, T.Imaginary80:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1816 case T.CharLiteral, T.WCharLiteral, T.DCharLiteral:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1817 case T.String:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1818 case T.LBracket:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1819 // case T.LBrace:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1820 case T.Function, T.Delegate:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1821 case T.Assert:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1822 // case T.Mixin:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1823 case T.Import:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1824 case T.Typeid:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1825 case T.Is:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1826 case T.LParen:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1827 // IntegralType
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1828 /+case T.Char, T.Wchar, T.Dchar, T.Bool,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1829 T.Byte, T.Ubyte, T.Short, T.Ushort,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1830 T.Int, T.Uint, T.Long, T.Ulong,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1831 T.Float, T.Double, T.Real,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1832 T.Ifloat, T.Idouble, T.Ireal,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1833 T.Cfloat, T.Cdouble, T.Creal, T.Void:+/
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1834 case T.Traits: // D2.0
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1835 // Tokens that can start a UnaryExpression:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1836 case T.AndBinary,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1837 T.PlusPlus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1838 T.MinusMinus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1839 T.Mul,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1840 T.Minus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1841 T.Plus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1842 T.Not,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1843 T.Tilde,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1844 T.New,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1845 T.Delete,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1846 T.Cast:
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1847 case_parseExpressionStatement:
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1848 s = new ExpressionStatement(parseExpression());
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1849 require(T.Semicolon);
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1850 break;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1851 default:
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1852 if (token.isSpecialToken)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1853 goto case_parseExpressionStatement;
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1854
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1855 if (token.type != T.Dollar)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1856 // Assert that this isn't a valid expression.
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1857 assert(
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1858 delegate bool(){
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1859 bool success;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1860 auto expression = try_(&parseExpression, success);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1861 return success;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1862 }() == false, "Didn't expect valid expression."
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1863 );
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1864
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1865 // Report error: it's an illegal statement.
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1866 error(MID.ExpectedButFound, "Statement", token.srcText);
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1867 s = new IllegalStatement(token);
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1868 nT();
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1869 }
205
e5a4f88982d1 - Added assert at the end of parseStatement().
aziz
parents: 204
diff changeset
1870 assert(s !is null);
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1871 set(s, begin);
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1872 return s;
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1873 }
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1874
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1875 /++
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1876 ScopeStatement:
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1877 NoScopeStatement
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1878 +/
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1879 Statement parseScopeStatement()
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1880 {
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1881 return new ScopeStatement(parseNoScopeStatement());
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1882 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1883
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1884 /++
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1885 NoScopeStatement:
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1886 NonEmptyStatement
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1887 BlockStatement
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1888 BlockStatement:
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1889 { }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1890 { StatementList }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1891 +/
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1892 Statement parseNoScopeStatement()
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1893 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1894 auto begin = token;
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1895 Statement s;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1896 if (token.type == T.LBrace)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1897 {
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1898 nT();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1899 auto ss = new Statements();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1900 while (token.type != T.RBrace && token.type != T.EOF)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1901 ss ~= parseStatement();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1902 require(T.RBrace);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1903 s = set(ss, begin);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1904 }
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1905 else if (token.type == T.Semicolon)
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1906 {
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1907 error(MID.ExpectedButFound, "non-empty statement", ";");
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1908 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1909 s = set(new EmptyStatement(), begin);
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1910 }
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1911 else
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1912 s = parseStatement();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1913 return s;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1914 }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1915
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1916 /++
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1917 NoScopeOrEmptyStatement:
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1918 ;
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1919 NoScopeStatement
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1920 +/
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1921 Statement parseNoScopeOrEmptyStatement()
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1922 {
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1923 if (token.type == T.Semicolon)
312
fa0b6f32c1ae - Added Special to enum TOK.
aziz
parents: 305
diff changeset
1924 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1925 auto begin = token;
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1926 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1927 return set(new EmptyStatement(), begin);
312
fa0b6f32c1ae - Added Special to enum TOK.
aziz
parents: 305
diff changeset
1928 }
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1929 else
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1930 return parseNoScopeStatement();
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1931 }
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1932
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1933 Statement parseAttributeStatement()
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1934 {
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1935 StorageClass stc, tmp;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1936 Linkage.Category link_cat;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1937
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1938 void addStorageClass()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1939 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1940 if (stc & tmp)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1941 error(MID.RedundantStorageClass, token.srcText);
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1942 else
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1943 stc |= tmp;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1944 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1945
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1946 Statement parse()
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1947 {
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1948 auto begin = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1949 Statement s;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1950 switch (token.type)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1951 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1952 case T.Extern:
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1953 stc |= StorageClass.Extern;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1954 nT();
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1955 Linkage linkage = parseLinkage();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1956
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1957 // Check for redundancy.
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1958 Linkage.Category link_cat_tmp = Linkage.getCategory(linkage);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1959 if (link_cat & link_cat_tmp)
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1960 {
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1961 char[] srcText = begin.srcText;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1962 if (link_cat_tmp == Linkage.Category.MangleSymbol)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1963 srcText = begin.start[0 .. prevToken.end - begin.start];
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1964 error(MID.RedundantStorageClass, srcText);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1965 }
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1966 else
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1967 link_cat |= link_cat_tmp;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
1968
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1969 s = new ExternStatement(linkage, parse());
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1970 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1971 case T.Static:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1972 tmp = StorageClass.Static;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1973 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1974 case T.Final:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1975 tmp = StorageClass.Final;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1976 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1977 case T.Const:
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1978 version(D2)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1979 {
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1980 if (peekNext() == T.LParen)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1981 goto case_Declaration;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1982 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1983 tmp = StorageClass.Const;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1984 goto Lcommon;
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1985 version(D2)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1986 {
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1987 case T.Invariant: // D 2.0
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1988 if (peekNext() == T.LParen)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1989 goto case_Declaration;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1990 tmp = StorageClass.Invariant;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1991 goto Lcommon;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
1992 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1993 case T.Auto:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1994 tmp = StorageClass.Auto;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1995 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1996 case T.Scope:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1997 tmp = StorageClass.Scope;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1998 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1999 Lcommon:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2000 addStorageClass();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2001 auto tok = token.type;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2002 nT();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2003 s = new AttributeStatement(tok, parse());
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2004 break;
239
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
2005 // TODO: allow "scope class", "abstract scope class" in function bodies?
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
2006 //case T.Class:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2007 default:
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2008 case_Declaration:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2009 s = new DeclarationStatement(parseDeclaration(stc));
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2010 }
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
2011 set(s, begin);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2012 return s;
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2013 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2014 return parse();
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2015 }
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2016
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2017 Statement parseIfStatement()
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2018 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2019 assert(token.type == T.If);
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2020 nT();
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2021
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2022 Statement variable;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2023 Expression condition;
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2024 Statement ifBody, elseBody;
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2025
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2026 require(T.LParen);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2027
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2028 Token* ident;
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2029 auto begin = token; // For start of AutoDeclaration or normal Declaration.
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2030 // auto Identifier = Expression
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2031 if (token.type == T.Auto)
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2032 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2033 nT();
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2034 ident = requireId();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2035 require(T.Assign);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2036 auto init = parseExpression();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2037 auto v = new VariableDeclaration(null, [ident], [init]);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2038 set(v, ident);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2039 auto d = new DeclarationStatement(v);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2040 set(d, ident);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2041 variable = new AttributeStatement(T.Auto, d);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2042 set(variable, begin);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2043 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2044 else
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2045 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2046 // Declarator = Expression
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2047 Type parseDeclaratorAssign()
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2048 {
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2049 auto type = parseDeclarator(ident);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2050 require(T.Assign);
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2051 return type;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2052 }
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2053 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
2054 auto type = try_(&parseDeclaratorAssign, success);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2055 if (success)
163
f27a98bb17c7 - Fix: when parsing Declarator fails, type and ident is set to null.
aziz
parents: 162
diff changeset
2056 {
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2057 auto init = parseExpression();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2058 auto v = new VariableDeclaration(type, [ident], [init]);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2059 set(v, begin);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2060 variable = new DeclarationStatement(v);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2061 set(variable, begin);
163
f27a98bb17c7 - Fix: when parsing Declarator fails, type and ident is set to null.
aziz
parents: 162
diff changeset
2062 }
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2063 else
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2064 condition = parseExpression();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2065 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2066 require(T.RParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2067 ifBody = parseScopeStatement();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2068 if (token.type == T.Else)
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2069 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2070 nT();
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2071 elseBody = parseScopeStatement();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2072 }
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2073 return new IfStatement(variable, condition, ifBody, elseBody);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2074 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2075
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2076 Statement parseWhileStatement()
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2077 {
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2078 assert(token.type == T.While);
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2079 nT();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2080 require(T.LParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2081 auto condition = parseExpression();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2082 require(T.RParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2083 return new WhileStatement(condition, parseScopeStatement());
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2084 }
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2085
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2086 Statement parseDoWhileStatement()
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2087 {
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2088 assert(token.type == T.Do);
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2089 nT();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2090 auto doBody = parseScopeStatement();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2091 require(T.While);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2092 require(T.LParen);
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2093 auto condition = parseExpression();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2094 require(T.RParen);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2095 return new DoWhileStatement(condition, doBody);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2096 }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2097
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2098 Statement parseForStatement()
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2099 {
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2100 assert(token.type == T.For);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2101 nT();
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2102 require(T.LParen);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2103
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2104 Statement init, forBody;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2105 Expression condition, increment;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2106
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2107 if (token.type != T.Semicolon)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2108 init = parseNoScopeStatement();
230
8f1790d16753 - Fix: added missing call to parseDeclaratorSuffx() in parseDeclaration.
aziz
parents: 229
diff changeset
2109 else
8f1790d16753 - Fix: added missing call to parseDeclaratorSuffx() in parseDeclaration.
aziz
parents: 229
diff changeset
2110 nT(); // Skip ;
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2111 if (token.type != T.Semicolon)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2112 condition = parseExpression();
168
fbbb2434bf6b - Simplified parseForStatement().
aziz
parents: 167
diff changeset
2113 require(T.Semicolon);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2114 if (token.type != T.RParen)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2115 increment = parseExpression();
168
fbbb2434bf6b - Simplified parseForStatement().
aziz
parents: 167
diff changeset
2116 require(T.RParen);
167
141b908e32b6 - Fix: forgot parsing forBody.
aziz
parents: 166
diff changeset
2117 forBody = parseScopeStatement();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2118 return new ForStatement(init, condition, increment, forBody);
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2119 }
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2120
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2121 Statement parseForeachStatement()
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2122 {
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2123 assert(token.type == T.Foreach || token.type == T.Foreach_reverse);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2124 TOK tok = token.type;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2125 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2126
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
2127 auto params = new Parameters;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2128 Expression e; // Aggregate or LwrExpression
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2129
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2130 require(T.LParen);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2131 while (1)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2132 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2133 auto paramBegin = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2134 Token* stcTok;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2135 Type type;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2136 Token* ident;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2137
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2138 switch (token.type)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2139 {
236
e961d1b957c3 - Fix in parseForeachStatement(): added T.Inout to case T.Ref; removed break statement.
aziz
parents: 235
diff changeset
2140 case T.Ref, T.Inout:
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2141 stcTok = token;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2142 nT();
236
e961d1b957c3 - Fix in parseForeachStatement(): added T.Inout to case T.Ref; removed break statement.
aziz
parents: 235
diff changeset
2143 // fall through
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2144 case T.Identifier:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2145 auto next = peekNext();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2146 if (next == T.Comma || next == T.Semicolon || next == T.RParen)
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2147 {
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2148 ident = token;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2149 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2150 break;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2151 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2152 // fall through
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2153 default:
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2154 type = parseDeclarator(ident);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2155 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2156
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2157 params ~= set(new Parameter(stcTok, type, ident, null), paramBegin);
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2158
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2159 if (token.type != T.Comma)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2160 break;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2161 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2162 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2163 require(T.Semicolon);
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2164 e = parseExpression();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2165 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2166 { //Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2167 if (token.type == T.Slice)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2168 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2169 // if (params.length != 1)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2170 // error(MID.XYZ); // TODO: issue error msg
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2171 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2172 auto upper = parseExpression();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2173 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2174 auto forBody = parseScopeStatement();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2175 return new ForeachRangeStatement(tok, params, e, upper, forBody);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2176 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2177 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2178 // Foreach (ForeachTypeList; Aggregate) ScopeStatement
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2179 require(T.RParen);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2180 auto forBody = parseScopeStatement();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2181 return new ForeachStatement(tok, params, e, forBody);
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2182 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2183
170
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2184 Statement parseSwitchStatement()
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2185 {
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2186 assert(token.type == T.Switch);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2187 nT();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2188
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2189 require(T.LParen);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2190 auto condition = parseExpression();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2191 require(T.RParen);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2192 auto switchBody = parseScopeStatement();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2193 return new SwitchStatement(condition, switchBody);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2194 }
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2195
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2196 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2197 Helper function for parsing the body of
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2198 a default or case statement.
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2199 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2200 Statement parseCaseOrDefaultBody()
220
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2201 {
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2202 // This function is similar to parseNoScopeStatement()
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2203 auto begin = token;
224
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2204 auto s = new Statements();
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2205 while (token.type != T.Case &&
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2206 token.type != T.Default &&
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2207 token.type != T.RBrace &&
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2208 token.type != T.EOF)
224
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2209 s ~= parseStatement();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2210 return set(new ScopeStatement(s), begin);
220
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2211 }
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2212
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2213 Statement parseCaseStatement()
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2214 {
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2215 assert(token.type == T.Case);
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
2216 nT();
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
2217 auto values = parseExpressionList();
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2218 require(T.Colon);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2219 auto caseBody = parseCaseOrDefaultBody();
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2220 return new CaseStatement(values, caseBody);
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2221 }
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2222
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2223 Statement parseDefaultStatement()
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2224 {
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2225 assert(token.type == T.Default);
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2226 nT();
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2227 require(T.Colon);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2228 auto defaultBody = parseCaseOrDefaultBody();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2229 return new DefaultStatement(defaultBody);
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2230 }
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2231
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2232 Statement parseContinueStatement()
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2233 {
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2234 assert(token.type == T.Continue);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2235 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2236 Token* ident;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2237 if (token.type == T.Identifier)
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2238 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2239 ident = token;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2240 nT();
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2241 }
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2242 require(T.Semicolon);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2243 return new ContinueStatement(ident);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2244 }
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2245
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2246 Statement parseBreakStatement()
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2247 {
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2248 assert(token.type == T.Break);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2249 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2250 Token* ident;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2251 if (token.type == T.Identifier)
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2252 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2253 ident = token;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2254 nT();
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2255 }
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2256 require(T.Semicolon);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2257 return new BreakStatement(ident);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2258 }
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2259
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2260 Statement parseReturnStatement()
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2261 {
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2262 assert(token.type == T.Return);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2263 nT();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2264 Expression expr;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2265 if (token.type != T.Semicolon)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2266 expr = parseExpression();
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2267 require(T.Semicolon);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2268 return new ReturnStatement(expr);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2269 }
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2270
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2271 Statement parseGotoStatement()
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2272 {
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2273 assert(token.type == T.Goto);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2274 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2275 Token* ident;
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2276 Expression caseExpr;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2277 switch (token.type)
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2278 {
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2279 case T.Case:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2280 nT();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2281 if (token.type == T.Semicolon)
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2282 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2283 caseExpr = parseExpression();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2284 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2285 case T.Default:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2286 nT();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2287 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2288 default:
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2289 ident = requireId();
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2290 }
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2291 require(T.Semicolon);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2292 return new GotoStatement(ident, caseExpr);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2293 }
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2294
177
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2295 Statement parseWithStatement()
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2296 {
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2297 assert(token.type == T.With);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2298 nT();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2299 require(T.LParen);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2300 auto expr = parseExpression();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2301 require(T.RParen);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2302 return new WithStatement(expr, parseScopeStatement());
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2303 }
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2304
178
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2305 Statement parseSynchronizedStatement()
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2306 {
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2307 assert(token.type == T.Synchronized);
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2308 nT();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2309 Expression expr;
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2310
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2311 if (token.type == T.LParen)
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2312 {
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2313 nT();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2314 expr = parseExpression();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2315 require(T.RParen);
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2316 }
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2317 return new SynchronizedStatement(expr, parseScopeStatement());
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2318 }
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2319
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2320 Statement parseTryStatement()
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2321 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2322 assert(token.type == T.Try);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2323 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2324
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2325 auto tryBody = parseScopeStatement();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2326 CatchBody[] catchBodies;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2327 FinallyBody finBody;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2328
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2329 while (token.type == T.Catch)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2330 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2331 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2332 Parameter param;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2333 if (token.type == T.LParen)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2334 {
229
a88967db063b - Fix: skip T.LParen in parseTryStatement().
aziz
parents: 228
diff changeset
2335 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2336 auto begin = token;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2337 Token* ident;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
2338 auto type = parseDeclarator(ident, true);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2339 param = new Parameter(null, type, ident, null);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2340 set(param, begin);
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2341 require(T.RParen);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2342 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2343 catchBodies ~= new CatchBody(param, parseNoScopeStatement());
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2344 if (param is null)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2345 break; // This is a LastCatch
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2346 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2347
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2348 if (token.type == T.Finally)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2349 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2350 auto begin = token;
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2351 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2352 finBody = new FinallyBody(parseNoScopeStatement());
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2353 set(finBody, begin);
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2354 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2355
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
2356 if (catchBodies.length == 0 && finBody is null)
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2357 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2358 // TODO: issue error msg.
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2359 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2360
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2361 return new TryStatement(tryBody, catchBodies, finBody);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2362 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2363
180
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2364 Statement parseThrowStatement()
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2365 {
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2366 assert(token.type == T.Throw);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2367 nT();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2368 auto expr = parseExpression();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2369 require(T.Semicolon);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2370 return new ThrowStatement(expr);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2371 }
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2372
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2373 Statement parseScopeGuardStatement()
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2374 {
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2375 assert(token.type == T.Scope);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2376 nT();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2377 assert(token.type == T.LParen);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2378 nT();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2379
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2380 Token* condition = requireId();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2381 if (condition)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2382 switch (condition.identifier)
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2383 {
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2384 case "exit":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2385 case "success":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2386 case "failure":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2387 break;
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2388 default:
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2389 // TODO: issue error msg.
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2390 }
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2391 require(T.RParen);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2392 Statement scopeBody;
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2393 if (token.type == T.LBrace)
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2394 scopeBody = parseScopeStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2395 else
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2396 scopeBody = parseNoScopeStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2397 return new ScopeGuardStatement(condition, scopeBody);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2398 }
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2399
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2400 Statement parseVolatileStatement()
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2401 {
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2402 assert(token.type == T.Volatile);
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2403 nT();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2404 Statement volatileBody;
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2405 if (token.type == T.Semicolon)
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2406 nT();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2407 else if (token.type == T.LBrace)
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2408 volatileBody = parseScopeStatement();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2409 else
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
2410 volatileBody = parseStatement();
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2411 return new VolatileStatement(volatileBody);
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2412 }
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2413
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2414 Statement parsePragmaStatement()
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2415 {
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2416 assert(token.type == T.Pragma);
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2417 nT();
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2418
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
2419 Token* ident;
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2420 Expression[] args;
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2421 Statement pragmaBody;
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2422
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2423 require(T.LParen);
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
2424 ident = requireId();
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2425
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2426 if (token.type == T.Comma)
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2427 {
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2428 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2429 args = parseExpressionList();
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2430 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2431 require(T.RParen);
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2432
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
2433 pragmaBody = parseNoScopeOrEmptyStatement();
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2434
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2435 return new PragmaStatement(ident, args, pragmaBody);
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2436 }
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2437
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2438 Statement parseStaticIfStatement()
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2439 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2440 assert(token.type == T.Static);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2441 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2442 assert(token.type == T.If);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2443 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2444 Expression condition;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2445 Statement ifBody, elseBody;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2446
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2447 require(T.LParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2448 condition = parseExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2449 require(T.RParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2450 ifBody = parseNoScopeStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2451 if (token.type == T.Else)
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2452 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2453 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2454 elseBody = parseNoScopeStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2455 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2456 return new StaticIfStatement(condition, ifBody, elseBody);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2457 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2458
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2459 Statement parseStaticAssertStatement()
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2460 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2461 assert(token.type == T.Static);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2462 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2463 assert(token.type == T.Assert);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2464 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2465 Expression condition, message;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2466 require(T.LParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2467 condition = parseAssignExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2468 if (token.type == T.Comma)
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2469 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2470 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2471 message = parseAssignExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2472 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2473 require(T.RParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2474 require(T.Semicolon);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2475 return new StaticAssertStatement(condition, message);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2476 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2477
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2478 Statement parseDebugStatement()
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2479 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2480 assert(token.type == T.Debug);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2481 nT(); // Skip debug keyword.
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2482
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2483 Token* cond; // debug ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2484 // debug ( Identifier )
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2485 Statement debugBody, elseBody;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2486
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2487 void parseIdentOrInt(ref Token* tok)
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2488 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2489 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2490 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2491 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2492 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2493 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2494 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2495 }
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2496 else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2497 expected(T.Identifier); // TODO: better error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2498 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2499
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2500 // if (token.type == T.Assign)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2501 // {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2502 // parseIdentOrInt(identSpec, levelSpec);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2503 // require(T.Semicolon);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2504 // }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2505 // else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2506 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2507 // Condition:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2508 // Integer
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2509 // Identifier
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2510
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2511 // ( Condition )
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2512 if (token.type == T.LParen)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2513 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2514 parseIdentOrInt(cond);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2515 require(T.RParen);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2516 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2517
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2518 // debug Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2519 // debug ( Condition ) Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2520 debugBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2521
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2522 // else Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2523 if (token.type == T.Else)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2524 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2525 // debug without condition and else body makes no sense
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2526 //if (levelCond == -1 && identCond.length == 0)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2527 // TODO: issue error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2528 nT();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2529 elseBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2530 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2531 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2532
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2533 return new DebugStatement(cond, debugBody, elseBody);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2534 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2535
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2536 Statement parseVersionStatement()
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2537 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2538 assert(token.type == T.Version);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2539
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2540 nT(); // Skip version keyword.
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2541
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2542 Token* cond; // version ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2543 // version ( Identifier )
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2544 Statement versionBody, elseBody;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2545
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2546 void parseIdentOrInt(ref Token* tok)
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2547 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2548 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2549 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2550 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2551 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2552 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2553 }
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2554 else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2555 expected(T.Identifier); // TODO: better error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2556 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2557
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2558 // if (token.type == T.Assign)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2559 // {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2560 // parseIdentOrInt(identSpec, levelSpec);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2561 // require(T.Semicolon);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2562 // }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2563 // else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2564 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2565 // Condition:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2566 // Integer
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2567 // Identifier
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2568
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2569 // ( Condition )
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2570 require(T.LParen);
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2571 parseIdentOrInt(cond);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2572 require(T.RParen);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2573
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2574 // version ( Condition ) Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2575 versionBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2576
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2577 // else Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2578 if (token.type == T.Else)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2579 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2580 nT();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2581 elseBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2582 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2583 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2584
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2585 return new VersionStatement(cond, versionBody, elseBody);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2586 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2587
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
2588 /+++++++++++++++++++++++++++++
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2589 + Assembler parsing methods +
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2590 +++++++++++++++++++++++++++++/
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2591
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2592 Statement parseAsmStatement()
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2593 {
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2594 assert(token.type == T.Asm);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2595 nT(); // Skip asm keyword.
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2596 require(T.LBrace);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2597 auto ss = new Statements;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2598 while (token.type != T.RBrace && token.type != T.EOF)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2599 ss ~= parseAsmInstruction();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2600 require(T.RBrace);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2601 return new AsmStatement(ss);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2602 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2603
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2604 Statement parseAsmInstruction()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2605 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2606 auto begin = token;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2607 Statement s;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2608 typeof(token) ident;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2609 switch (token.type)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2610 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2611 // Keywords that are valid opcodes.
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2612 case T.In, T.Int, T.Out:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2613 ident = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2614 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2615 goto LOpcode;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2616 case T.Identifier:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2617 ident = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2618 nT(); // Skip Identifier
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2619 if (token.type == T.Colon)
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2620 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2621 // Identifier : AsmInstruction
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2622 nT(); // Skip :
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2623 s = new LabeledStatement(ident, parseAsmInstruction());
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2624 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2625 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2626
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2627 LOpcode:
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2628 // Opcode ;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2629 // Opcode Operands ;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2630 // Opcode
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2631 // Identifier
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2632 Expression[] es;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2633 if (token.type != T.Semicolon)
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2634 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2635 while (1)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2636 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2637 es ~= parseAsmExpression();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2638 if (token.type != T.Comma)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2639 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2640 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2641 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2642 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2643 require(T.Semicolon);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2644 s = new AsmInstruction(ident, es);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2645 break;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2646 case T.Align:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2647 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2648 auto number = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2649 switch (token.type)
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2650 {
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2651 case T.Int32, T.Int64, T.Uint32, T.Uint64:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2652 number = token; nT(); break;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2653 default:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2654 if (token.type != T.Semicolon)
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2655 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2656 number = null;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2657 // TODO: report error: number expected after asm align statement.
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2658 error(MID.ExpectedButFound, "integer", token.srcText);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2659 }
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2660 require(T.Semicolon);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2661 s = new AsmAlignStatement(number);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2662 break;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2663 case T.Semicolon:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2664 s = new EmptyStatement();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2665 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2666 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2667 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2668 error(MID.ExpectedButFound, "AsmInstruction", token.srcText);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2669 s = new IllegalAsmInstruction(token);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2670 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2671 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2672 set(s, begin);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2673 return s;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2674 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2675
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2676 Expression parseAsmExpression()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2677 {
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2678 auto begin = token;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2679 auto e = parseAsmOrOrExpression();
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2680 if (token.type == T.Question)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2681 {
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
2682 auto tok = token;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2683 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2684 auto iftrue = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2685 require(T.Colon);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2686 auto iffalse = parseAsmExpression();
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
2687 e = new CondExpression(e, iftrue, iffalse, tok);
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2688 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2689 }
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2690 // TODO: create AsmExpression that contains e?
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2691 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2692 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2693
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2694 Expression parseAsmOrOrExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2695 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2696 alias parseAsmAndAndExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2697 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2698 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2699 while (token.type == T.OrLogical)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2700 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2701 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2702 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2703 e = new OrOrExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2704 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2705 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2706 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2707 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2708
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2709 Expression parseAsmAndAndExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2710 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2711 alias parseAsmOrExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2712 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2713 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2714 while (token.type == T.AndLogical)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2715 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2716 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2717 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2718 e = new AndAndExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2719 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2720 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2721 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2722 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2723
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2724 Expression parseAsmOrExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2725 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2726 alias parseAsmXorExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2727 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2728 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2729 while (token.type == T.OrBinary)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2730 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2731 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2732 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2733 e = new OrExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2734 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2735 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2736 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2737 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2738
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2739 Expression parseAsmXorExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2740 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2741 alias parseAsmAndExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2742 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2743 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2744 while (token.type == T.Xor)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2745 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2746 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2747 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2748 e = new XorExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2749 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2750 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2751 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2752 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2753
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2754 Expression parseAsmAndExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2755 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2756 alias parseAsmCmpExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2757 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2758 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2759 while (token.type == T.AndBinary)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2760 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2761 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2762 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2763 e = new AndExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2764 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2765 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2766 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2767 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2768
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2769 Expression parseAsmCmpExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2770 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2771 alias parseAsmShiftExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2772 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2773 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2774
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2775 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2776 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2777 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2778 case T.Equal, T.NotEqual:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2779 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2780 e = new EqualExpression(e, parseNext(), operator);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2781 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2782 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2783 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2784 e = new RelExpression(e, parseNext(), operator);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2785 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2786 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2787 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2788 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2789 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2790 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2791 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2792
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2793 Expression parseAsmShiftExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2794 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2795 alias parseAsmAddExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2796 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2797 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2798 while (1)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2799 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2800 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2801 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2802 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2803 case T.LShift: nT(); e = new LShiftExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2804 case T.RShift: nT(); e = new RShiftExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2805 case T.URShift: nT(); e = new URShiftExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2806 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2807 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2808 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2809 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2810 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2811 assert(0);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2812 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2813
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2814 Expression parseAsmAddExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2815 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2816 alias parseAsmMulExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2817 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2818 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2819 while (1)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2820 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2821 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2822 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2823 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2824 case T.Plus: nT(); e = new PlusExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2825 case T.Minus: nT(); e = new MinusExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2826 // Not allowed in asm
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2827 //case T.Tilde: nT(); e = new CatExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2828 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2829 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2830 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2831 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2832 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2833 assert(0);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2834 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2835
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2836 Expression parseAsmMulExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2837 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2838 alias parseAsmPostExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2839 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2840 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2841 while (1)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2842 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2843 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2844 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2845 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2846 case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2847 case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2848 case T.Mod: nT(); e = new ModExpression(e, parseNext(), operator); break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2849 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2850 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2851 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2852 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2853 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2854 assert(0);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2855 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2856
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2857 Expression parseAsmPostExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2858 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2859 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2860 auto e = parseAsmUnaryExpression();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2861 while (token.type == T.LBracket)
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2862 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2863 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2864 e = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2865 e = new AsmPostBracketExpression(e);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2866 require(T.RBracket);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2867 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2868 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2869 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2870 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2871
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2872 Expression parseAsmUnaryExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2873 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2874 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2875 Expression e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2876 switch (token.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2877 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2878 case T.Byte, T.Short, T.Int,
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2879 T.Float, T.Double, T.Real:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2880 goto LAsmTypePrefix;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2881 case T.Identifier:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2882 switch (token.identifier)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2883 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2884 case "near", "far", /*"byte", "short", "int",*/
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
2885 "word", "dword", "qword"/*, "float", "double", "real"*/:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2886 LAsmTypePrefix:
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2887 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2888 if (token.type == T.Identifier && token.identifier == "ptr")
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2889 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2890 else
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2891 error(MID.ExpectedButFound, "ptr", token.srcText);
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2892 e = new AsmTypeExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2893 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2894 case "offset":
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2895 nT();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2896 e = new AsmOffsetExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2897 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2898 case "seg":
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2899 nT();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2900 e = new AsmSegExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2901 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2902 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2903 goto LparseAsmPrimaryExpression;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2904 }
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2905 break;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2906 case T.Minus:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2907 case T.Plus:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2908 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2909 e = new SignExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2910 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2911 case T.Not:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2912 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2913 e = new NotExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2914 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2915 case T.Tilde:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2916 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2917 e = new CompExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2918 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2919 LparseAsmPrimaryExpression:
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2920 e = parseAsmPrimaryExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2921 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2922 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2923 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2924 return e;
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2925 }
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2926
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2927 Expression parseAsmPrimaryExpression()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2928 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2929 auto begin = token;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2930 Expression e;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2931 switch (token.type)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2932 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2933 case T.Int32, T.Int64, T.Uint32, T.Uint64:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
2934 e = new IntExpression(token.type, token.ulong_);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2935 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2936 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2937 case T.Float32, T.Float64, T.Float80,
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2938 T.Imaginary32, T.Imaginary64, T.Imaginary80:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
2939 e = new RealExpression(token.type, token.real_);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2940 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2941 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2942 case T.Dollar:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2943 e = new DollarExpression();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2944 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2945 break;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2946 case T.LBracket:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2947 // [ AsmExpression ]
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2948 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2949 e = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2950 require(T.RBracket);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2951 e = new AsmBracketExpression(e);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2952 break;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2953 case T.Identifier:
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2954 switch (token.identifier)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2955 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2956 // __LOCAL_SIZE
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2957 case "__LOCAL_SIZE":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2958 e = new AsmLocalSizeExpression();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2959 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2960 break;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2961 // Register
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2962 case "ST":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2963 auto register = token;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2964 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2965 // (1) - (7)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2966 Token* number;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2967 if (token.type == T.LParen)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2968 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2969 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2970 if (token.type == T.Int32)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2971 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2972 number = token;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2973 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2974 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2975 else
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2976 expected(T.Int32);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2977 require(T.RParen);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2978 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2979 e = new AsmRegisterExpression(register, number);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2980 break;
417
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2981 case "FS":
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2982 auto register = token;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2983 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2984 // TODO: is the colon-number part optional?
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2985 Token* number;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2986 if (token.type == T.Colon)
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2987 {
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2988 // :0, :4, :8
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2989 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2990 switch (token.srcText)
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2991 {
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2992 case "0", "4", "8":
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2993 number = token;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2994 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2995 break;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2996 default:
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2997 error(MID.ExpectedButFound, "0, 4 or 8", token.srcText);
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2998 }
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
2999 }
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3000 e = new AsmRegisterExpression(register, number);
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3001 break;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3002 case "AL", "AH", "AX", "EAX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3003 "BL", "BH", "BX", "EBX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3004 "CL", "CH", "CX", "ECX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3005 "DL", "DH", "DX", "EDX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3006 "BP", "EBP",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3007 "SP", "ESP",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3008 "DI", "EDI",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3009 "SI", "ESI",
417
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3010 "ES", "CS", "SS", "DS", "GS",
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3011 "CR0", "CR2", "CR3", "CR4",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3012 "DR0", "DR1", "DR2", "DR3", "DR6", "DR7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3013 "TR3", "TR4", "TR5", "TR6", "TR7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3014 "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3015 "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3016 e = new AsmRegisterExpression(token);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3017 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3018 break;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3019 default:
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3020 // DotIdentifier
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3021 Expression[] identList;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3022 while (1)
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3023 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3024 auto begin2 = token;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3025 auto ident = requireId();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3026 e = new IdentifierExpression(ident);
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3027 set(e, begin2);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3028 identList ~= e;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3029 if (token.type != T.Dot)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3030 break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3031 nT(); // Skip dot.
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3032 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3033 e = new DotListExpression(identList);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3034 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3035 break;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3036 default:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3037 error(MID.ExpectedButFound, "Expression", token.srcText);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3038 e = new EmptyExpression();
414
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3039 if (!trying)
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3040 {
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3041 // Insert a dummy token and don't consume current one.
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3042 begin = lx.insertEmptyTokenBefore(token);
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3043 prevToken = begin;
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3044 }
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3045 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3046 set(e, begin);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3047 return e;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3048 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3049
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
3050 /+++++++++++++++++++++++++++++
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3051 + Expression parsing methods +
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3052 +++++++++++++++++++++++++++++/
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3053
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3054 Expression parseExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3055 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3056 auto begin = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3057 auto e = parseAssignExpression();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
3058 while (token.type == T.Comma)
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3059 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3060 auto comma = token;
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3061 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3062 e = new CommaExpression(e, parseAssignExpression(), comma);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3063 set(e, begin);
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3064 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3065 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3066 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3067
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3068 Expression parseAssignExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3069 {
319
83f1f9a4f248 - Removed assigment to 'begin' from loop. Initializing 'begin' at decl point.
aziz
parents: 318
diff changeset
3070 auto begin = token;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3071 auto e = parseCondExpression();
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3072 while (1)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3073 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3074 switch (token.type)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3075 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3076 case T.Assign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3077 nT(); e = new AssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3078 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3079 case T.LShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3080 nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3081 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3082 case T.RShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3083 nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3084 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3085 case T.URShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3086 nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3087 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3088 case T.OrAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3089 nT(); e = new OrAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3090 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3091 case T.AndAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3092 nT(); e = new AndAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3093 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3094 case T.PlusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3095 nT(); e = new PlusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3096 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3097 case T.MinusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3098 nT(); e = new MinusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3099 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3100 case T.DivAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3101 nT(); e = new DivAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3102 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3103 case T.MulAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3104 nT(); e = new MulAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3105 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3106 case T.ModAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3107 nT(); e = new ModAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3108 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3109 case T.XorAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3110 nT(); e = new XorAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3111 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3112 case T.CatAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3113 nT(); e = new CatAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3114 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3115 default:
218
6c0d274e0f3f - Removed goto from parseAssignExpression().
aziz
parents: 217
diff changeset
3116 return e;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3117 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3118 set(e, begin);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3119 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3120 return e;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3121 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3122
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3123 Expression parseCondExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3124 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3125 auto begin = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3126 auto e = parseOrOrExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3127 if (token.type == T.Question)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3128 {
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
3129 auto tok = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3130 nT();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3131 auto iftrue = parseExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3132 require(T.Colon);
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3133 auto iffalse = parseCondExpression();
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
3134 e = new CondExpression(e, iftrue, iffalse, tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3135 set(e, begin);
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3136 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3137 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3138 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3139
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3140 Expression parseOrOrExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3141 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3142 alias parseAndAndExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3143 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3144 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3145 while (token.type == T.OrLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3146 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3147 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3148 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3149 e = new OrOrExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3150 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3151 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3152 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3153 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3154
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3155 Expression parseAndAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3156 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3157 alias parseOrExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3158 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3159 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3160 while (token.type == T.AndLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3161 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3162 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3163 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3164 e = new AndAndExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3165 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3166 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3167 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3168 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3169
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3170 Expression parseOrExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3171 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3172 alias parseXorExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3173 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3174 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3175 while (token.type == T.OrBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3176 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3177 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3178 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3179 e = new OrExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3180 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3181 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3182 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3183 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3184
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3185 Expression parseXorExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3186 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3187 alias parseAndExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3188 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3189 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3190 while (token.type == T.Xor)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3191 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3192 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3193 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3194 e = new XorExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3195 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3196 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3197 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3198 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3199
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3200 Expression parseAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3201 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3202 alias parseCmpExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3203 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3204 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3205 while (token.type == T.AndBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3206 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3207 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3208 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3209 e = new AndExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3210 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3211 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3212 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3213 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3214
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3215 Expression parseCmpExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3216 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3217 alias parseShiftExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3218 auto begin = token;
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3219 auto e = parseShiftExpression();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3220
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3221 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3222 switch (operator.type)
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3223 {
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3224 case T.Equal, T.NotEqual:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3225 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3226 e = new EqualExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3227 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3228 case T.Not:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
3229 if (peekNext() != T.Is)
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3230 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3231 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3232 // fall through
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3233 case T.Is:
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3234 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3235 e = new IdentityExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3236 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3237 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3238 T.Unordered, T.UorE, T.UorG, T.UorGorE,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3239 T.UorL, T.UorLorE, T.LorEorG, T.LorG:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3240 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3241 e = new RelExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3242 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3243 case T.In:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3244 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3245 e = new InExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3246 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3247 default:
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3248 return e;
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3249 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3250 set(e, begin);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3251 return e;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3252 }
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3253
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3254 Expression parseShiftExpression()
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3255 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3256 alias parseAddExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3257 auto begin = token;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3258 auto e = parseNext();
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3259 while (1)
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3260 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3261 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3262 switch (operator.type)
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3263 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3264 case T.LShift: nT(); e = new LShiftExpression(e, parseNext(), operator); break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3265 case T.RShift: nT(); e = new RShiftExpression(e, parseNext(), operator); break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3266 case T.URShift: nT(); e = new URShiftExpression(e, parseNext(), operator); break;
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3267 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3268 return e;
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3269 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3270 set(e, begin);
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3271 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3272 assert(0);
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3273 }
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3274
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3275 Expression parseAddExpression()
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3276 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3277 alias parseMulExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3278 auto begin = token;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3279 auto e = parseNext();
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3280 while (1)
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3281 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3282 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3283 switch (operator.type)
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3284 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3285 case T.Plus: nT(); e = new PlusExpression(e, parseNext(), operator); break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3286 case T.Minus: nT(); e = new MinusExpression(e, parseNext(), operator); break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3287 case T.Tilde: nT(); e = new CatExpression(e, parseNext(), operator); break;
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3288 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3289 return e;
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3290 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3291 set(e, begin);
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3292 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3293 assert(0);
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3294 }
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3295
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3296 Expression parseMulExpression()
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3297 {
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3298 alias parsePostExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3299 auto begin = token;
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3300 auto e = parseNext();
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3301 while (1)
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3302 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3303 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3304 switch (operator.type)
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3305 {
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3306 case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3307 case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3308 case T.Mod: nT(); e = new ModExpression(e, parseNext(), operator); break;
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3309 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3310 return e;
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3311 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3312 set(e, begin);
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3313 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3314 assert(0);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3315 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3316
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3317 Expression parsePostExpression()
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3318 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3319 auto begin = token;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3320 auto e = parseUnaryExpression();
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3321 while (1)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3322 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3323 switch (token.type)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3324 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3325 case T.Dot:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3326 e = new PostDotListExpression(e, parseDotListExpression());
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3327 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3328 case T.PlusPlus:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3329 e = new PostIncrExpression(e);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3330 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3331 case T.MinusMinus:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3332 e = new PostDecrExpression(e);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3333 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3334 case T.LParen:
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3335 e = new CallExpression(e, parseArguments());
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3336 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3337 case T.LBracket:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3338 // parse Slice- and IndexExpression
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3339 nT();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3340 // [] is a SliceExpression
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3341 if (token.type == T.RBracket)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3342 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3343 e = new SliceExpression(e, null, null);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3344 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3345 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3346
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3347 Expression[] es = [parseAssignExpression()];
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3348
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3349 // [ AssignExpression .. AssignExpression ]
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3350 if (token.type == T.Slice)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3351 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3352 nT();
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3353 e = new SliceExpression(e, es[0], parseAssignExpression());
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3354 require(T.RBracket);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3355 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3356 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3357
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3358 // [ ExpressionList ]
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3359 if (token.type == T.Comma)
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3360 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3361 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3362 es ~= parseExpressionList();
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3363 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3364 require(T.RBracket);
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3365
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3366 e = new IndexExpression(e, es);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3367 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3368 default:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3369 return e;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3370 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3371 nT();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3372 Lset: // Jumped here to skip nT().
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3373 set(e, begin);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3374 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3375 assert(0);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3376 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3377
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3378 Expression parseUnaryExpression()
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3379 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3380 auto begin = token;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3381 Expression e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3382 switch (token.type)
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3383 {
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3384 case T.AndBinary:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3385 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3386 e = new AddressExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3387 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3388 case T.PlusPlus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3389 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3390 e = new PreIncrExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3391 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3392 case T.MinusMinus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3393 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3394 e = new PreDecrExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3395 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3396 case T.Mul:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3397 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3398 e = new DerefExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3399 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3400 case T.Minus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3401 case T.Plus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3402 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3403 e = new SignExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3404 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3405 case T.Not:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3406 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3407 e = new NotExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3408 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3409 case T.Tilde:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3410 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3411 e = new CompExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3412 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3413 case T.New:
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3414 e = parseNewExpression();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3415 return e;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3416 case T.Delete:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3417 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3418 e = new DeleteExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3419 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3420 case T.Cast:
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3421 requireNext(T.LParen);
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3422 Type type;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3423 switch (token.type)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3424 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3425 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3426 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3427 auto begin2 = token;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3428 case T.Const:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3429 type = new ConstType(null);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3430 goto case_break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3431 case T.Invariant:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3432 type = new InvariantType(null);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3433 case_break:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3434 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3435 set(type, begin2);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3436 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3437 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3438 default:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3439 type = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3440 }
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3441 require(T.RParen);
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3442 e = new CastExpression(parseUnaryExpression(), type);
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3443 break;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3444 case T.LParen:
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3445 // ( Type ) . Identifier
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3446 Type parseType_()
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3447 {
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3448 nT();
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3449 auto type = parseType();
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3450 require(T.RParen);
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
3451 require(T.Dot);
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3452 return type;
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3453 }
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3454 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
3455 auto type = try_(&parseType_, success);
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3456 if (success)
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3457 {
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3458 auto ident = requireId();
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3459 e = new TypeDotIdExpression(type, ident);
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3460 break;
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3461 }
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3462 goto default;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3463 default:
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3464 e = parsePrimaryExpression();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3465 return e;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3466 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3467 assert(e !is null);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3468 set(e, begin);
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3469 return e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3470 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3471
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
3472 Expression parsePrimaryExpression()
78
f043759fb59a - Added code to parseUnaryExpression(); not fully implemented.
aziz
parents: 77
diff changeset
3473 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3474 auto begin = token;
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3475 Expression e;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3476 switch (token.type)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3477 {
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3478 case T.Identifier, T.Dot, T.Typeof:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3479 e = parseDotListExpression();
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3480 break;
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3481 case T.This:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3482 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3483 e = new ThisExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3484 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3485 case T.Super:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3486 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3487 e = new SuperExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3488 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3489 case T.Null:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3490 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3491 e = new NullExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3492 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3493 case T.True, T.False:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3494 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3495 e = new BoolExpression();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3496 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3497 case T.Dollar:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3498 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3499 e = new DollarExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3500 break;
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3501 case T.Int32, T.Int64, T.Uint32, T.Uint64:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3502 e = new IntExpression(token.type, token.ulong_);
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3503 nT();
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3504 break;
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3505 case T.Float32, T.Float64, T.Float80,
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3506 T.Imaginary32, T.Imaginary64, T.Imaginary80:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3507 e = new RealExpression(token.type, token.real_);
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3508 nT();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3509 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3510 case T.CharLiteral, T.WCharLiteral, T.DCharLiteral:
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3511 e = new CharExpression(token);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3512 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3513 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3514 case T.String:
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3515 Token*[] stringLiterals;
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3516 do
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3517 {
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3518 stringLiterals ~= token;
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3519 nT();
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3520 } while (token.type == T.String)
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3521 e = new StringExpression(stringLiterals);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3522 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3523 case T.LBracket:
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3524 Expression[] values;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3525
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3526 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3527 if (token.type != T.RBracket)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3528 {
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3529 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3530 if (token.type == T.Colon)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3531 goto LparseAssocArray;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3532 if (token.type == T.Comma)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3533 {
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3534 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3535 values = [e] ~ parseExpressionList();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3536 }
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3537 require(T.RBracket);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3538 }
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3539 else
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3540 nT();
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3541
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3542 e = new ArrayLiteralExpression(values);
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3543 break;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3544
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3545 LparseAssocArray:
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3546 Expression[] keys;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3547
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3548 keys ~= e;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3549 nT(); // Skip colon.
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3550 goto LenterLoop;
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3551
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3552 while (1)
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
3553 {
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3554 keys ~= parseAssignExpression();
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3555 require(T.Colon);
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3556 LenterLoop:
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3557 values ~= parseAssignExpression();
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3558 if (token.type != T.Comma)
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3559 break;
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3560 nT();
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
3561 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3562 require(T.RBracket);
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3563 e = new AArrayLiteralExpression(keys, values);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3564 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3565 case T.LBrace:
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
3566 // DelegateLiteral := { Statements }
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3567 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3568 e = new FunctionLiteralExpression(funcBody);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3569 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3570 case T.Function, T.Delegate:
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
3571 // FunctionLiteral := (function|delegate) Type? '(' ArgumentList ')' '{' Statements '}'
133
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3572 nT(); // Skip function|delegate token.
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3573 Type returnType;
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3574 Parameters parameters;
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3575 if (token.type != T.LBrace)
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3576 {
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3577 if (token.type != T.LParen) // Optional return type
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3578 returnType = parseType();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3579 parameters = parseParameterList();
133
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3580 }
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3581 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3582 e = new FunctionLiteralExpression(returnType, parameters, funcBody);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3583 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3584 case T.Assert:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3585 Expression msg;
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3586 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3587 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3588 if (token.type == T.Comma)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3589 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3590 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3591 msg = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3592 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3593 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3594 e = new AssertExpression(e, msg);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3595 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3596 case T.Mixin:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3597 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3598 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3599 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3600 e = new MixinExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3601 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3602 case T.Import:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3603 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3604 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3605 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3606 e = new ImportExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3607 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3608 case T.Typeid:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3609 requireNext(T.LParen);
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3610 auto type = parseType();
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3611 require(T.RParen);
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3612 e = new TypeidExpression(type);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3613 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3614 case T.Is:
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3615 requireNext(T.LParen);
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3616
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3617 Type type, specType;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
3618 Token* ident; // optional Identifier
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3619 Token* opTok, specTok;
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3620
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3621 type = parseDeclarator(ident, true);
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3622
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3623 switch (token.type)
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3624 {
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3625 case T.Colon, T.Equal:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3626 opTok = token;
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3627 nT();
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3628 switch (token.type)
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3629 {
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3630 case T.Typedef,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3631 T.Struct,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3632 T.Union,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3633 T.Class,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3634 T.Interface,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3635 T.Enum,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3636 T.Function,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3637 T.Delegate,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3638 T.Super,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3639 T.Return:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3640 specTok = token;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3641 nT();
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3642 break;
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3643 default:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3644 specType = parseType();
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3645 }
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3646 default:
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3647 }
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3648
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3649 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3650 version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3651 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3652 // is ( Type Identifier : TypeSpecialization , TemplateParameterList )
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3653 // is ( Type Identifier == TypeSpecialization , TemplateParameterList )
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3654 if (ident && specType && token.type == T.Comma)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3655 tparams = parseTemplateParameterList2();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3656 }
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3657 require(T.RParen);
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3658 e = new IsExpression(type, ident, opTok, specTok, specType, tparams);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3659 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3660 case T.LParen:
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3661 if (tokenAfterParenIs(T.LBrace))
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3662 {
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3663 auto parameters = parseParameterList();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3664 // ( ParameterList ) FunctionBody
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3665 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3666 e = new FunctionLiteralExpression(null, parameters, funcBody);
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3667 }
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3668 else
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3669 {
131
ce636f3981cc - Removed TOK.Number.
aziz
parents: 130
diff changeset
3670 // ( Expression )
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3671 nT();
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3672 e = parseExpression();
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3673 require(T.RParen);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3674 // TODO: create ParenExpression?
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3675 }
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3676 break;
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3677 // IntegralType . Identifier
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3678 case T.Char, T.Wchar, T.Dchar, T.Bool,
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3679 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3680 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3681 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3682 T.Ifloat, T.Idouble, T.Ireal,
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3683 T.Cfloat, T.Cdouble, T.Creal, T.Void:
280
1eb54f6f392e - Made class Type abstract.
aziz
parents: 272
diff changeset
3684 auto type = new IntegralType(token.type);
247
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3685 nT();
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3686 set(type, begin);
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3687 require(T.Dot);
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3688 auto ident = requireId();
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3689
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3690 e = new TypeDotIdExpression(type, ident);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3691 break;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3692 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3693 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3694 case T.Traits:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3695 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3696 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3697 auto id = requireId();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3698 TemplateArguments args;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3699 if (token.type == T.Comma)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3700 args = parseTemplateArguments2();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3701 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3702 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3703 e = new TraitsExpression(id, args);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3704 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3705 }
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3706 default:
343
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3707 if (token.isSpecialToken)
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3708 {
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3709 e = new SpecialTokenExpression(token);
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3710 nT();
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3711 break;
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3712 }
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3713
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3714 error(MID.ExpectedButFound, "Expression", token.srcText);
136
96468715ea79 - Returning EmptyExpression in parsePrimaryExpression() when no token matched.
aziz
parents: 135
diff changeset
3715 e = new EmptyExpression();
414
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3716 if (!trying)
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3717 {
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3718 // Insert a dummy token and don't consume current one.
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3719 begin = lx.insertEmptyTokenBefore(token);
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3720 prevToken = begin;
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3721 }
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3722 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3723 set(e, begin);
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3724 return e;
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3725 }
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3726
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3727 Expression parseNewExpression(/*Expression e*/)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3728 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3729 auto begin = token;
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3730 assert(token.type == T.New);
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3731 nT(); // Skip new keyword.
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3732
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3733 Expression[] newArguments;
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3734 Expression[] ctorArguments;
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3735
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3736 if (token.type == T.LParen)
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3737 newArguments = parseArguments();
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3738
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3739 // NewAnonClassExpression:
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3740 // new (ArgumentList)opt class (ArgumentList)opt SuperClassopt InterfaceClassesopt ClassBody
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3741 if (token.type == T.Class)
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3742 {
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3743 nT();
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3744 if (token.type == T.LParen)
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3745 ctorArguments = parseArguments();
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3746
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3747 BaseClass[] bases = token.type != T.LBrace ? parseBaseClasses(false) : null ;
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3748
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3749 auto decls = parseDeclarationDefinitionsBlock();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3750 return set(new NewAnonClassExpression(/*e, */newArguments, bases, ctorArguments, decls), begin);
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3751 }
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3752
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3753 // NewExpression:
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3754 // NewArguments Type [ AssignExpression ]
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3755 // NewArguments Type ( ArgumentList )
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3756 // NewArguments Type
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3757 auto type = parseType();
302
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3758
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3759 if (token.type == T.LParen)
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3760 ctorArguments = parseArguments();
302
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3761
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3762 return set(new NewExpression(/*e, */newArguments, type, ctorArguments), begin);
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3763 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3764
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3765 Type parseType()
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3766 {
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
3767 return parseBasicType2(parseBasicType());
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3768 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3769
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3770 Type parseBasicType()
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3771 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3772 auto begin = token;
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3773 Type t;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3774 // IdentifierType tident;
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3775
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3776 switch (token.type)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3777 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3778 case T.Char, T.Wchar, T.Dchar, T.Bool,
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3779 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3780 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3781 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3782 T.Ifloat, T.Idouble, T.Ireal,
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3783 T.Cfloat, T.Cdouble, T.Creal, T.Void:
280
1eb54f6f392e - Made class Type abstract.
aziz
parents: 272
diff changeset
3784 t = new IntegralType(token.type);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3785 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3786 set(t, begin);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3787 break;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
3788 case T.Identifier, T.Typeof, T.Dot:
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3789 t = parseDotListType();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
3790 assert(!isNodeSet(t));
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
3791 set(t, begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
3792 break;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3793 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3794 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3795 case T.Const:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3796 // const ( Type )
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3797 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3798 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3799 t = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3800 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3801 t = new ConstType(t);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3802 set(t, begin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3803 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3804 case T.Invariant:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3805 // invariant ( Type )
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3806 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3807 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3808 t = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3809 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3810 t = new InvariantType(t);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3811 set(t, begin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3812 break;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3813 } // version(D2)
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3814 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3815 error(MID.ExpectedButFound, "BasicType", token.srcText);
134
a31aa0d6dd5e - Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents: 133
diff changeset
3816 t = new UndefinedType();
259
8118da6fee44 - Moved nT() below statement where an attribute class is constructed.
aziz
parents: 258
diff changeset
3817 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3818 set(t, begin);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3819 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3820 return t;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3821 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3822
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3823 Type parseBasicType2(Type t)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3824 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3825 typeof(token) begin;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3826 while (1)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3827 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3828 begin = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3829 switch (token.type)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3830 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3831 case T.Mul:
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3832 t = new PointerType(t);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3833 nT();
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3834 break;
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3835 case T.LBracket:
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3836 t = parseArrayType(t);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3837 continue;
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3838 case T.Function, T.Delegate:
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3839 TOK tok = token.type;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3840 nT();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3841 auto parameters = parseParameterList();
135
145e0d68ec95 - Added enum TID to module Type.
aziz
parents: 134
diff changeset
3842 if (tok == T.Function)
291
c0e857931ff6 - Changed FunctionType and DelegateType. Both receive return type and parameters.
aziz
parents: 290
diff changeset
3843 t = new FunctionType(t, parameters);
135
145e0d68ec95 - Added enum TID to module Type.
aziz
parents: 134
diff changeset
3844 else
291
c0e857931ff6 - Changed FunctionType and DelegateType. Both receive return type and parameters.
aziz
parents: 290
diff changeset
3845 t = new DelegateType(t, parameters);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3846 break;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3847 default:
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3848 return t;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3849 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3850 set(t, begin);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3851 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3852 assert(0);
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3853 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3854
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3855 bool tokenAfterParenIs(TOK tok)
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3856 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3857 // We count nested parentheses tokens because template types may appear inside parameter lists; e.g. (int x, Foo!(int) y).
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3858 assert(token.type == T.LParen);
239
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
3859 Token* next = token;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3860 uint level = 1;
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3861 Loop:
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3862 while (1)
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3863 {
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3864 lx.peek(next);
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3865 switch (next.type)
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3866 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3867 case T.RParen:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3868 if (--level == 0)
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3869 { // Last, closing parentheses found.
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3870 do
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3871 lx.peek(next);
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3872 while (next.isWhitespace)
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3873 break Loop;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3874 }
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3875 break;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3876 case T.LParen:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3877 ++level;
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3878 break;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3879 case T.EOF:
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3880 break Loop;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3881 default:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3882 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3883 }
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3884 return next.type == tok;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3885 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3886
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3887 Type parseDeclaratorSuffix(Type t)
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3888 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3889 switch (token.type)
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3890 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3891 case T.LBracket:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3892 // Type Identifier ArrayType
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3893 // ArrayType := [] or [Type] or [Expression..Expression]
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3894 do
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3895 t = parseArrayType(t);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3896 while (token.type == T.LBracket)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3897 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3898 /+ // parsed in parseDeclaration()
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3899 case T.LParen:
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
3900 TemplateParameters tparams;
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3901 if (tokenAfterParenIs(T.LParen))
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3902 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3903 // ( TemplateParameterList ) ( ParameterList )
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3904 tparams = parseTemplateParameterList();
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3905 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3906
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3907 auto params = parseParameterList();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3908 // ReturnType FunctionName ( ParameterList )
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3909 t = new FunctionType(t, params, tparams);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3910 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3911 +/
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3912 default:
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3913 break;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3914 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3915 return t;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3916 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3917
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3918 Type parseArrayType(Type t)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3919 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3920 assert(token.type == T.LBracket);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3921 auto begin = token;
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3922 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3923 if (token.type == T.RBracket)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3924 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3925 t = new ArrayType(t);
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3926 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3927 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3928 else
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3929 {
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
3930 bool success;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3931 Type parseAAType()
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3932 {
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3933 auto type = parseType();
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3934 require(T.RBracket);
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3935 return type;
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3936 }
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
3937 auto assocType = try_(&parseAAType, success);
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
3938 if (success)
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3939 t = new ArrayType(t, assocType);
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3940 else
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3941 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3942 Expression e = parseExpression(), e2;
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3943 if (token.type == T.Slice)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3944 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3945 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3946 e2 = parseExpression();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3947 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3948 t = new ArrayType(t, e, e2);
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3949 require(T.RBracket);
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3950 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3951 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3952 set(t, begin);
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3953 return t;
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3954 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3955
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3956 Type parseCFunctionPointerType(Type type, ref Token* ident, bool optionalParamList)
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3957 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3958 assert(token.type == T.LParen);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3959 assert(type !is null);
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3960 auto begin = token;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3961 nT(); // Skip (
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3962 type = parseBasicType2(type);
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3963 if (token.type == T.LParen)
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3964 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3965 // Can be nested.
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3966 type = parseCFunctionPointerType(type, ident, true);
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3967 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3968 else if (token.type == T.Identifier)
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3969 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3970 // The identifier of the function pointer and the declaration.
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3971 ident = token;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3972 nT();
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3973 type = parseDeclaratorSuffix(type);
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3974 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3975 require(T.RParen);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3976
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3977 Parameters params;
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3978 if (optionalParamList)
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3979 params = token.type == T.LParen ? parseParameterList() : null;
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3980 else
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3981 params = parseParameterList();
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3982
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3983 type = set(new CFuncPointerType(type, params), begin);
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3984 return type;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3985 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3986
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
3987 Type parseDeclarator(ref Token* ident, bool identOptional = false)
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3988 {
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
3989 auto t = parseType();
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3990
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3991 if (token.type == T.LParen)
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3992 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3993 t = parseCFunctionPointerType(t, ident, true);
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3994 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
3995 else if (token.type == T.Identifier)
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3996 {
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
3997 ident = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3998 nT();
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
3999 t = parseDeclaratorSuffix(t);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4000 }
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4001
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4002 if (ident is null && !identOptional)
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
4003 expected(T.Identifier);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
4004
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
4005 return t;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4006 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4007
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4008 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4009 Parse a list of AssignExpressions.
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4010 ExpressionList:
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4011 AssignExpression
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4012 AssignExpression , ExpressionList
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4013 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4014 Expression[] parseExpressionList()
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4015 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4016 Expression[] expressions;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4017 while (1)
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4018 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4019 expressions ~= parseAssignExpression();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4020 if (token.type != T.Comma)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4021 break;
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4022 nT();
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4023 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4024 return expressions;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4025 }
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4026
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4027 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4028 Arguments:
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4029 ( )
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4030 ( ExpressionList )
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4031 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4032 Expression[] parseArguments()
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4033 {
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4034 assert(token.type == T.LParen);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4035 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4036 Expression[] args;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4037 if (token.type != TOK.RParen)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4038 args = parseExpressionList();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4039 require(TOK.RParen);
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4040 return args;
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4041 }
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4042
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
4043 Parameters parseParameterList()
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4044 out(params)
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4045 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4046 if (params.length > 1)
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4047 foreach (param; params.items[0..$-1])
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4048 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4049 if (param.isVariadic())
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4050 assert(0, "variadic arguments can only appear at the end of the parameter list.");
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4051 }
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4052 }
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4053 body
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4054 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4055 auto begin = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4056 require(T.LParen);
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4057
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4058 auto params = new Parameters();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4059
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4060 if (token.type == T.RParen)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4061 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4062 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4063 return set(params, begin);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4064 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4065
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4066 while (1)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4067 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4068 auto paramBegin = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4069 Token* stcTok;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4070 StorageClass stc, tmp;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4071
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4072 if (token.type == T.Ellipses)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4073 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4074 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4075 params ~= set(new Parameter(null, null, null, null), paramBegin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4076 break; // Exit loop.
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4077 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4078
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4079 Lstc_loop:
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4080 switch (token.type)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4081 {
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4082 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4083 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4084 case T.Invariant: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4085 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4086 goto default;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4087 tmp = StorageClass.Invariant;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4088 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4089 case T.Const: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4090 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4091 goto default;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4092 tmp = StorageClass.Const;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4093 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4094 case T.Final: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4095 tmp = StorageClass.Final;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4096 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4097 case T.Scope: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4098 tmp = StorageClass.Scope;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4099 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4100 case T.Static: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4101 tmp = StorageClass.Static;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4102 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4103 case T.In:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4104 tmp = StorageClass.In;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4105 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4106 case T.Out:
282
74113a9aa77c - Fix: assigned wrong StorageClass to variable.
aziz
parents: 280
diff changeset
4107 tmp = StorageClass.Out;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4108 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4109 case T.Inout, T.Ref:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4110 tmp = StorageClass.Ref;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4111 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4112 case T.Lazy:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4113 tmp = StorageClass.Lazy;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4114 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4115 Lcommon:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4116 if (stc & tmp)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4117 error(MID.RedundantStorageClass, token.srcText);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4118 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4119 stc |= tmp;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4120 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4121 goto Lstc_loop;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4122 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4123 else // else body of version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4124 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4125 case T.In, T.Out, T.Inout, T.Ref, T.Lazy:
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4126 stcTok = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4127 nT();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4128 goto default;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4129 }
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4130 default:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4131 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4132 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4133 if (stc != StorageClass.None)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4134 stcTok = begin;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4135 }
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4136 Token* ident;
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
4137 auto type = parseDeclarator(ident, true);
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
4138
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4139 Expression assignExpr;
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4140 if (token.type == T.Assign)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4141 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4142 nT();
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4143 assignExpr = parseAssignExpression();
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4144 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4145
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4146 if (token.type == T.Ellipses)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4147 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4148 auto p = set(new Parameter(stcTok, type, ident, assignExpr), paramBegin);
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4149 p.stc |= StorageClass.Variadic;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4150 params ~= p;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4151 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4152 break; // Exit loop.
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4153 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4154
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4155 params ~= set(new Parameter(stcTok, type, ident, assignExpr), paramBegin);
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4156
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4157 if (token.type != T.Comma)
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4158 break; // Exit loop.
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4159 nT();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4160 continue;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4161 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4162 break; // Exit loop.
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4163 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4164 require(T.RParen);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4165 return set(params, begin);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4166 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4167
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
4168 TemplateArguments parseTemplateArguments()
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4169 {
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4170 TemplateArguments targs;
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4171 require(T.LParen);
255
7ba0229af908 - Fixed parseTemplateArguments. Removed a return path and put the while loop into an if-statement.
aziz
parents: 254
diff changeset
4172 if (token.type != T.RParen)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4173 targs = parseTemplateArguments_();
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4174 require(T.RParen);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4175 return targs;
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4176 }
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4177
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4178 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4179 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4180 TemplateArguments parseTemplateArguments2()
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4181 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4182 assert(token.type == T.Comma);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4183 nT();
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4184 TemplateArguments targs;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4185 if (token.type != T.RParen)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4186 targs = parseTemplateArguments_();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4187 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4188 error(MID.ExpectedButFound, "Type/Expression", ")");
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4189 require(T.RParen);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4190 return targs;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4191 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4192 } // version(D2)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4193
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4194 TemplateArguments parseTemplateArguments_()
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4195 {
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4196 auto begin = token;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4197 auto targs = new TemplateArguments;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4198 while (1)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4199 {
379
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4200 Type parseType_()
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4201 {
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4202 auto type = parseType();
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4203 if (token.type == T.Comma || token.type == T.RParen)
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4204 return type;
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4205 ++errorCount; // Cause try_() to fail.
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4206 return null;
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4207 }
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4208 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
4209 auto typeArgument = try_(&parseType_, success);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4210 if (success)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4211 // TemplateArgument:
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4212 // Type
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4213 // Symbol
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4214 targs ~= typeArgument;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4215 else
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4216 // TemplateArgument:
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4217 // AssignExpression
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4218 targs ~= parseAssignExpression();
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4219 if (token.type != T.Comma)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4220 break; // Exit loop.
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4221 nT();
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4222 }
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4223 set(targs, begin);
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4224 return targs;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4225 }
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4226
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4227 TemplateParameters parseTemplateParameterList()
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4228 {
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4229 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4230 require(T.LParen);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4231 if (token.type != T.RParen)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4232 tparams = parseTemplateParameterList_();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4233 require(T.RParen);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4234 return tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4235 }
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4236
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4237 version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4238 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4239 TemplateParameters parseTemplateParameterList2()
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4240 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4241 assert(token.type == T.Comma);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4242 nT();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4243 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4244 if (token.type != T.RParen)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4245 tparams = parseTemplateParameterList_();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4246 else
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4247 error(MID.ExpectedButFound, "Type/Expression", ")");
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4248 return tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4249 }
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4250 } // version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4251
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4252 TemplateParameters parseTemplateParameterList_()
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4253 {
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4254 auto begin = token;
295
75b47c71a34c - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 293
diff changeset
4255 auto tparams = new TemplateParameters;
75b47c71a34c - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 293
diff changeset
4256
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4257 while (1)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4258 {
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4259 auto paramBegin = token;
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4260 TemplateParameter tp;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4261 Token* ident;
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4262 Type specType, defType;
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4263
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4264 void parseSpecAndOrDefaultType()
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4265 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4266 // : SpecializationType
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4267 if (token.type == T.Colon)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4268 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4269 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4270 specType = parseType();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4271 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4272 // = DefaultType
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4273 if (token.type == T.Assign)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4274 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4275 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4276 defType = parseType();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4277 }
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4278 }
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4279
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4280 switch (token.type)
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4281 {
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4282 case T.Alias:
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4283 // TemplateAliasParameter:
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4284 // alias Identifier
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4285 nT(); // Skip alias keyword.
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4286 ident = requireId();
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4287 parseSpecAndOrDefaultType();
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4288 tp = new TemplateAliasParameter(ident, specType, defType);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4289 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4290 case T.Identifier:
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4291 ident = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
4292 switch (peekNext())
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4293 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4294 case T.Ellipses:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4295 // TemplateTupleParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4296 // Identifier ...
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4297 nT(); // Skip Identifier.
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4298 nT(); // Skip Ellipses.
341
3ac651ea83fb - Fix: created TemplateAliasParameter instead of TemplateTypeParameter.
aziz
parents: 340
diff changeset
4299 if (token.type == T.Comma)
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
4300 error(MID.TemplateTupleParameter);
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4301 tp = new TemplateTupleParameter(ident);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4302 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4303 case T.Comma, T.RParen, T.Colon, T.Assign:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4304 // TemplateTypeParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4305 // Identifier
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4306 nT(); // Skip Identifier.
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4307 parseSpecAndOrDefaultType();
341
3ac651ea83fb - Fix: created TemplateAliasParameter instead of TemplateTypeParameter.
aziz
parents: 340
diff changeset
4308 tp = new TemplateTypeParameter(ident, specType, defType);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4309 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4310 default:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4311 // TemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4312 // Declarator
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4313 ident = null;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4314 goto LTemplateValueParameter;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4315 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4316 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4317 default:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4318 LTemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4319 // TemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4320 // Declarator
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4321 Expression specValue, defValue;
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4322 auto valueType = parseDeclarator(ident);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4323 // : SpecializationValue
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4324 if (token.type == T.Colon)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4325 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4326 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4327 specValue = parseCondExpression();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4328 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4329 // = DefaultValue
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4330 if (token.type == T.Assign)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4331 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4332 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4333 defValue = parseCondExpression();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4334 }
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4335 tp = new TemplateValueParameter(valueType, ident, specValue, defValue);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4336 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4337
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4338 // Push template parameter.
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4339 tparams ~= set(tp, paramBegin);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4340
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4341 if (token.type != T.Comma)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4342 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4343 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4344 }
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4345 set(tparams, begin);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4346 return tparams;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4347 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4348
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
4349 void expected(TOK tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4350 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
4351 if (token.type != tok)
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
4352 error(MID.ExpectedButFound, Token.toString(tok), token.srcText);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4353 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4354
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4355 void require(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4356 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
4357 if (token.type == tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4358 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4359 else
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
4360 error(MID.ExpectedButFound, Token.toString(tok), token.srcText);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4361 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4362
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4363 void requireNext(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4364 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4365 nT();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4366 require(tok);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4367 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4368
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4369 Token* requireId()
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4370 {
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4371 if (token.type == T.Identifier)
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4372 {
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4373 auto id = token;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4374 nT();
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4375 return id;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4376 }
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4377 else
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4378 error(MID.ExpectedButFound, "Identifier", token.srcText);
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4379 return null;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4380 }
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4381
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
4382 void error(MID mid, ...)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
4383 {
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4384 if (trying)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4385 {
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4386 ++errorCount;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4387 return;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4388 }
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
4389 auto location = Lexer.getLocation(this.token);
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
4390 auto msg = Format(_arguments, _argptr, GetMsg(mid));
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
4391 errors ~= new Information(InfoType.Parser, mid, location, msg);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
4392 }
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
4393 }