annotate trunk/src/dil/Parser.d @ 495:b60450804b6e

Attributes are evaluated during the parsing phase now. Renamed parseDeclarationDefinitionsBlock to parseDeclarationDefinitionsBody. Renamed parseDeclaration to parseVariableOrFunction. Removed class Linkage, renamed parseLinkage to parseLinkageType and modified it so that it returns a value from enum LinkageType. Fix in parseStorageAttribute(): class invariants are recognized now. Modified parseAlignAttribute() so that returns an uint - the alignment size. Removed classes AttributeStatement and ExternStatement. Using Declarations instead in parseAttributeStatement(). Added LinkageType to module Enums. Added StorageClassDeclaration and renamed ExternDeclaration to LinkageDeclaration.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 08 Dec 2007 22:20:34 +0100
parents 9a7ca8c56e59
children 5a607597dc22
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;
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
16 import dil.CompilerInfo;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
17 import common;
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
18
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
19 private alias TOK T;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
20
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
21 /++
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
22 The Parser produces an abstract syntax tree (AST) by analyzing
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
23 the tokens of the provided source code.
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
24 +/
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
25 class Parser
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
26 {
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
27 Lexer lx;
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
28 Token* token; /// Current non-whitespace token.
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
29 Token* prevToken; /// Previous non-whitespace token.
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
30
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
31 Information[] errors;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
32
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
33 ImportDeclaration[] imports; /// ImportDeclarations in the source text.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
34
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
35 LinkageType linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
36 Protection protection;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
37 StorageClass storageClass;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
38 uint alignSize = DEFAULT_ALIGN_SIZE;
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
39
491
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
40 this(char[] srcText, string filePath, InformationManager infoMan = null)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
41 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
42 lx = new Lexer(srcText, filePath);
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
43 }
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
44
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
45 protected void init()
206
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
46 {
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
47 nT();
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
48 prevToken = token;
206
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
49 }
f9f5c0949a06 - Added method start().
aziz
parents: 205
diff changeset
50
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
51 void nT()
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
52 {
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
53 prevToken = token;
132
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
54 do
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
55 {
c97a3f683d13 - Skipping comments in nT().
aziz
parents: 131
diff changeset
56 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
57 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
58 } while (token.isWhitespace) // Skip whitespace
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
59 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
60
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
61 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
62 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
63 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
64 Declarations start()
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
65 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
66 init();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
67 auto begin = token;
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
68 auto decls = new Declarations;
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
69 if (token.type == T.Module)
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
70 decls ~= parseModuleDeclaration();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
71 decls.addOptChildren(parseDeclarationDefinitions());
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
72 set(decls, begin);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
73 return decls;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
74 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
75
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
76 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
77 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
78 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
79 Expression start2()
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 init();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
82 return parseExpression();
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
83 }
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
84
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
85 uint trying;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
86 uint errorCount;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
87
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
88 /++
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
89 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
90 the state of the lexer and parser are restored.
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
91 +/
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
92 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
93 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
94 auto oldToken = this.token;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
95 auto oldPrevToken = this.prevToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
96 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
97
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
98 ++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
99 auto result = parseMethod();
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
100 --trying;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
101 // Check if an error occurred.
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
102 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
103 {
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
104 // Restore members.
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
105 token = oldToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
106 prevToken = oldPrevToken;
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
107 lx.token = oldToken;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
108 errorCount = oldCount;
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
109 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
110 }
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
111 else
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
112 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
113 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
114 }
105
df34ec47fb81 - Added getState() method and State struct to Lexer.
aziz
parents: 104
diff changeset
115
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
116 /++
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
117 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
118 +/
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
119 Class set(Class)(Class node, Token* begin)
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
120 {
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
121 node.setTokens(begin, this.prevToken);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
122 return node;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
123 }
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
124
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
125 /++
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
126 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
127 +/
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
128 bool isNodeSet(Node node)
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
129 {
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
130 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
131 }
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
132
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
133 TOK peekNext()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
134 {
239
7911f6a92e6e - Added 'new' and 'delete' declarations to Token and uncommented next and prev members. Added HEAD to TOK.
aziz
parents: 238
diff changeset
135 Token* next = token;
296
3a2afc425ceb - Fix in peekNext(): need to skip comments.
aziz
parents: 295
diff changeset
136 do
3a2afc425ceb - Fix in peekNext(): need to skip comments.
aziz
parents: 295
diff changeset
137 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
138 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
139 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
140 }
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
141
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
142 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
143 {
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
144 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
145 do
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
146 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
147 while (next.isWhitespace) // Skip whitespace
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
148 return next.type;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
149 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
150
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
151 /++++++++++++++++++++++++++++++
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
152 + Declaration parsing methods +
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
153 ++++++++++++++++++++++++++++++/
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
154
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
155 Declaration parseModuleDeclaration()
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
156 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
157 auto begin = token;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
158 ModuleFQN moduleFQN;
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
159 do
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
160 {
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
161 nT();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
162 moduleFQN ~= requireId();
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
163 } while (token.type == T.Dot)
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
164 require(T.Semicolon);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
165 return set(new ModuleDeclaration(moduleFQN), begin);
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
166 }
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
167
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
168 /++
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
169 Parse DeclarationDefinitions until the end of file is hit.
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
170 DeclDefs:
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
171 DeclDef
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
172 DeclDefs
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
173 +/
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
174 Declaration[] parseDeclarationDefinitions()
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
175 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
176 Declaration[] decls;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
177 while (token.type != T.EOF)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
178 decls ~= parseDeclarationDefinition();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
179 return decls;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
180 }
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
181
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
182 /++
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
183 Parse the body of a template, class, interface, struct or union.
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
184 DeclDefsBlock:
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
185 { }
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
186 { DeclDefs }
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
187 +/
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
188 Declarations parseDeclarationDefinitionsBody()
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
189 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
190 // Save attributes.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
191 auto linkageType = this.linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
192 auto protection = this.protection;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
193 auto storageClass = this.storageClass;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
194 // Clear attributes.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
195 this.linkageType = LinkageType.None;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
196 this.protection = Protection.None;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
197 this.storageClass = StorageClass.None;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
198
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
199 // Parse body.
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
200 auto begin = token;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
201 auto decls = new Declarations;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
202 require(T.LBrace);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
203 while (token.type != T.RBrace && token.type != T.EOF)
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
204 decls ~= parseDeclarationDefinition();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
205 require(T.RBrace);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
206 set(decls, begin);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
207
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
208 // Restore original values.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
209 this.linkageType = linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
210 this.protection = protection;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
211 this.storageClass = storageClass;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
212
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
213 return decls;
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()
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
217 out(decl)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
218 { assert(isNodeSet(decl)); }
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
219 body
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
220 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
221 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
222 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
223 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
224 {
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
225 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
226 T.Pragma,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
227 // Protection attributes
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
228 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
229 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
230 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
231 T.Protected,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
232 T.Public:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
233 decl = parseAttributeSpecifier();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
234 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
235 // Storage classes
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
236 case T.Extern,
203
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
237 T.Deprecated,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
238 T.Override,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
239 T.Abstract,
4f949a3a394b - synchronized is parsed as an Attribute in parseDeclarationDefinition() now.
aziz
parents: 202
diff changeset
240 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
241 //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
242 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
243 T.Const,
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
244 //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
245 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
246 T.Scope:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
247 case_StaticAttribute:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
248 case_InvariantAttribute: // D 2.0
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
249 return parseStorageAttribute();
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
250 case T.Alias:
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
251 nT();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
252 // TODO: parse StorageClasses?
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
253 decl = new AliasDeclaration(parseVariableOrFunction());
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
254 break;
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
255 case T.Typedef:
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
256 nT();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
257 // TODO: parse StorageClasses?
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
258 decl = new TypedefDeclaration(parseVariableOrFunction());
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
259 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
260 case T.Static:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
261 switch (peekNext())
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
262 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
263 case T.Import:
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
264 goto case_Import;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
265 case T.This:
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
266 decl = parseStaticConstructorDeclaration();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
267 break;
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
268 case T.Tilde:
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
269 decl = parseStaticDestructorDeclaration();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
270 break;
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
271 case T.If:
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
272 decl = parseStaticIfDeclaration();
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
273 break;
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
274 case T.Assert:
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
275 decl = parseStaticAssertDeclaration();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
276 break;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
277 default:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
278 goto case_StaticAttribute;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
279 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
280 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
281 case T.Import:
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
282 case_Import:
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
283 decl = parseImportDeclaration();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
284 imports ~= CastTo!(ImportDeclaration)(decl);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
285 // Handle specially. StorageClass mustn't be set.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
286 decl.setProtection(this.protection);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
287 return set(decl, begin);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
288 case T.Enum:
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
289 decl = parseEnumDeclaration();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
290 break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
291 case T.Class:
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
292 decl = parseClassDeclaration();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
293 break;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
294 case T.Interface:
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
295 decl = parseInterfaceDeclaration();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
296 break;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
297 case T.Struct, T.Union:
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
298 decl = parseAggregateDeclaration();
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
299 break;
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
300 case T.This:
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
301 decl = parseConstructorDeclaration();
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
302 break;
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
303 case T.Tilde:
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
304 decl = parseDestructorDeclaration();
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
305 break;
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
306 case T.Invariant:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
307 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
308 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
309 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
310 if (peekAfter(next) == T.LParen)
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
311 {
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
312 if (peekAfter(next) != T.RParen)
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
313 goto case_Declaration;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
314 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
315 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
316 goto case_InvariantAttribute;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
317 }
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
318 decl = parseInvariantDeclaration();
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
319 break;
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
320 case T.Unittest:
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
321 decl = parseUnittestDeclaration();
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
322 break;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
323 case T.Debug:
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
324 decl = parseDebugDeclaration();
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
325 break;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
326 case T.Version:
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
327 decl = parseVersionDeclaration();
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
328 break;
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
329 case T.Template:
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
330 decl = parseTemplateDeclaration();
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
331 break;
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
332 case T.New:
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
333 decl = parseNewDeclaration();
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
334 break;
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
335 case T.Delete:
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
336 decl = parseDeleteDeclaration();
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
337 break;
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
338 case T.Mixin:
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
339 decl = parseMixin!(MixinDeclaration)();
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
340 break;
129
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
341 case T.Semicolon:
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
342 nT();
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
343 decl = new EmptyDeclaration();
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
344 break;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
345 // Declaration
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
346 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
347 // IntegralType
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
348 case T.Char, T.Wchar, T.Dchar, T.Bool,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
349 T.Byte, T.Ubyte, T.Short, T.Ushort,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
350 T.Int, T.Uint, T.Long, T.Ulong,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
351 T.Float, T.Double, T.Real,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
352 T.Ifloat, T.Idouble, T.Ireal,
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
353 T.Cfloat, T.Cdouble, T.Creal, T.Void:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
354 case_Declaration:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
355 return parseVariableOrFunction(this.storageClass, this.protection, this.linkageType);
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
356 /+case T.Module:
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
357 // 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
358 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
359 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
360 error(MID.ExpectedButFound, "Declaration", token.srcText);
292
076152e945e0 - Added member Node[] children to class Node.
aziz
parents: 291
diff changeset
361 decl = new IllegalDeclaration(token);
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
362 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
363 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
364 decl.setProtection(this.protection);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
365 decl.setStorageClass(this.storageClass);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
366 assert(!isNodeSet(decl));
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
367 set(decl, begin);
129
a9244d409652 - Added class EmptyDeclaration.
aziz
parents: 128
diff changeset
368 return decl;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
369 }
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
370
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
371 /++
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
372 DeclarationsBlock:
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
373 : DeclDefs
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
374 { }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
375 { DeclDefs }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
376 DeclDef
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
377 +/
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
378 Declaration parseDeclarationsBlock(bool noColon = false)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
379 {
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
380 Declaration d;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
381 switch (token.type)
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
382 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
383 case T.LBrace:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
384 nT();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
385 auto begin = token;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
386 auto decls = new Declarations;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
387 while (token.type != T.RBrace && token.type != T.EOF)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
388 decls ~= parseDeclarationDefinition();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
389 require(T.RBrace);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
390 d = set(decls, begin);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
391 break;
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
392 case T.Colon:
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
393 if (noColon == true)
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
394 goto default;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
395 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
396 auto begin = token;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
397 auto decls = new Declarations;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
398 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
399 decls ~= parseDeclarationDefinition();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
400 d = set(decls, begin);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
401 break;
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
402 default:
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
403 d = parseDeclarationDefinition();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
404 }
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
405 assert(isNodeSet(d));
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
406 return d;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
407 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
408
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
409 Declaration parseDeclarationsBlockNoColon()
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
410 {
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
411 return parseDeclarationsBlock(true);
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
412 }
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
413
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
414 /++
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
415 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
416 Params:
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
417 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
418 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
419 +/
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
420 Declaration parseVariableOrFunction(StorageClass stc = StorageClass.None,
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
421 Protection protection = Protection.None,
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
422 LinkageType linkType = LinkageType.None,
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
423 bool optionalParameterList = true)
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
424 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
425 auto begin = token;
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
426 Type type;
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
427 Token* ident;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
428
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
429 // Check for AutoDeclaration: StorageClasses Identifier =
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
430 if (stc != StorageClass.None &&
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
431 token.type == T.Identifier &&
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
432 peekNext() == T.Assign)
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
433 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
434 ident = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
435 nT();
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
436 }
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
437 else
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
438 {
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
439 type = parseType();
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
440 if (token.type == T.LParen)
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
441 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
442 // 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
443 // 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
444 // Example:
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
445 // void foo() {
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
446 // // 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
447 // some_type (*p_func)(int);
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
448 // // 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
449 // 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
450 // }
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
451 // // 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
452 // something(*p);
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
453 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
454 }
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
455 else
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
456 {
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
457 ident = requireId();
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
458 // Type FunctionName ( ParameterList ) FunctionBody
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
459 if (token.type == T.LParen)
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
460 {
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
461 // It's a function declaration
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
462 TemplateParameters tparams;
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
463 if (tokenAfterParenIs(T.LParen))
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
464 {
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
465 // ( TemplateParameterList ) ( ParameterList )
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
466 tparams = parseTemplateParameterList();
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
467 }
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
468
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
469 auto params = parseParameterList();
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
470 version(D2)
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
471 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
472 switch (token.type)
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
473 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
474 case T.Const:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
475 stc |= StorageClass.Const;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
476 nT();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
477 break;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
478 case T.Invariant:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
479 stc |= StorageClass.Invariant;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
480 nT();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
481 break;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
482 default:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
483 }
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
484 }
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
485 // ReturnType FunctionName ( ParameterList )
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
486 auto funcBody = parseFunctionBody();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
487 auto d = new FunctionDeclaration(type, ident, tparams, params, funcBody);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
488 d.setStorageClass(stc);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
489 d.setLinkageType(linkType);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
490 d.setProtection(protection);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
491 return set(d, begin);
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
492 }
415
b18b0cd8f8cd Fixed parsing C function pointers in declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 414
diff changeset
493 type = parseDeclaratorSuffix(type);
202
8aecf8925c5f - Added code for parsing AutoDeclaration in parseDeclaration().
aziz
parents: 201
diff changeset
494 }
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
495 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
496
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
497 // It's a variable declaration.
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
498 Token*[] idents = [ident];
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
499 Expression[] values;
199
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
500 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
501 while (token.type == T.Comma)
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
502 {
222
4f31e4671e06 - Fix: nT() wasn't called in while loop to skip T.Comma.
aziz
parents: 220
diff changeset
503 nT();
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
504 idents ~= requireId();
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
505 LenterLoop:
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
506 if (token.type == T.Assign)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
507 nT(), (values ~= parseInitializer());
199
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
508 else
a95fee6e4b7e - Fix: parseDeclaration(): appending null to values when no initializer present.
aziz
parents: 198
diff changeset
509 values ~= null;
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
510 }
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
511 require(T.Semicolon);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
512 auto d = new VariableDeclaration(type, idents, values);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
513 d.setStorageClass(stc);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
514 d.setLinkageType(linkType);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
515 d.setProtection(protection);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
516 return set(d, begin);
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
517 }
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
518
194
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
519 Expression parseInitializer()
b3604b237292 - Implemented parsing variable declarations.
aziz
parents: 193
diff changeset
520 {
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
521 if (token.type == T.Void)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
522 {
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
523 auto begin = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
524 auto next = peekNext();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
525 if (next == T.Comma || next == T.Semicolon)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
526 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
527 nT();
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
528 return set(new VoidInitializer(), begin);
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
529 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
530 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
531 return parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
532 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
533
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
534 Expression parseNonVoidInitializer()
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
535 {
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
536 auto begin = token;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
537 Expression init;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
538 switch (token.type)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
539 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
540 case T.LBracket:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
541 // ArrayInitializer:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
542 // [ ]
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
543 // [ ArrayMemberInitializations ]
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
544 Expression[] keys;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
545 Expression[] values;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
546
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
547 nT();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
548 while (token.type != T.RBracket)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
549 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
550 auto e = parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
551 if (token.type == T.Colon)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
552 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
553 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
554 keys ~= e;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
555 values ~= parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
556 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
557 else
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
558 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
559 keys ~= null;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
560 values ~= e;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
561 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
562
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
563 if (token.type != T.Comma)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
564 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
565 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
566 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
567 require(T.RBracket);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
568 init = new ArrayInitializer(keys, values);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
569 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
570 case T.LBrace:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
571 // StructInitializer:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
572 // { }
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
573 // { StructMemberInitializers }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
574 Expression parseStructInitializer()
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
575 {
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
576 Token*[] idents;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
577 Expression[] values;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
578
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
579 nT();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
580 while (token.type != T.RBrace)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
581 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
582 if (token.type == T.Identifier)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
583 {
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
584 // 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
585 if (peekNext() == T.Colon)
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
586 {
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
587 idents ~= token;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
588 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
589 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
590 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
591 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
592 // NonVoidInitializer
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
593 values ~= parseNonVoidInitializer();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
594
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
595 if (token.type != T.Comma)
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
596 break;
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
597 nT();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
598 }
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
599 require(T.RBrace);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
600 return new StructInitializer(idents, values);
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
601 }
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
602
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
603 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
604 auto si = try_(&parseStructInitializer, success);
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
605 if (success)
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
606 {
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
607 init = si;
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
608 break;
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
609 }
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
610 assert(token.type == T.LBrace);
200
61f60112ac63 - Fix: parsing AssignExpression when parsing StructInitializer failed.
aziz
parents: 199
diff changeset
611 //goto default;
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
612 default:
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
613 init = parseAssignExpression();
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
614 }
266
fea4e8b6cea5 - Added begin variables and calls to set().
aziz
parents: 265
diff changeset
615 set(init, begin);
198
88c1777a9e51 - Implemented parseInitializer() and parseNonVoidInitializer().
aziz
parents: 197
diff changeset
616 return init;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
617 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
618
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
619 FunctionBody parseFunctionBody()
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
620 {
268
c19b68a4e3db - FunctionBody inherits from Node now.
aziz
parents: 267
diff changeset
621 auto begin = token;
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
622 auto func = new FunctionBody;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
623 while (1)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
624 {
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
625 switch (token.type)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
626 {
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
627 case T.LBrace:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
628 func.funcBody = parseStatements();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
629 break;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
630 case T.Semicolon:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
631 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
632 break;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
633 case T.In:
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
634 if (func.inBody)
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
635 error(MID.InContract);
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
636 nT();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
637 func.inBody = parseStatements();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
638 continue;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
639 case T.Out:
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
640 if (func.outBody)
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
641 error(MID.OutContract);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
642 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
643 if (token.type == T.LParen)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
644 {
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
645 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
646 func.outIdent = requireId();
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
647 require(T.RParen);
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
648 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
649 func.outBody = parseStatements();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
650 continue;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
651 case T.Body:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
652 nT();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
653 goto case T.LBrace;
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
654 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
655 error(MID.ExpectedButFound, "FunctionBody", token.srcText);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
656 }
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
657 break; // Exit loop.
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
658 }
268
c19b68a4e3db - FunctionBody inherits from Node now.
aziz
parents: 267
diff changeset
659 set(func, begin);
299
559d5d62e0c1 - Added checks for null before adding member to Node.children.
aziz
parents: 298
diff changeset
660 func.finishConstruction();
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
661 return func;
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
662 }
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
663
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
664 LinkageType parseLinkageType()
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
665 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
666 LinkageType linkageType;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
667 if (token.type != T.LParen)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
668 return linkageType;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
669
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
670 nT(); // Skip (
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
671 if (token.type == T.RParen)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
672 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
673 nT();
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
674 error(MID.MissingLinkageType);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
675 return linkageType;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
676 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
677
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
678 auto ident = requireId();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
679
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
680 switch (ident ? ident.identifier : null)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
681 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
682 case "C":
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
683 if (token.type == T.PlusPlus)
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
684 {
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
685 nT();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
686 linkageType = LinkageType.Cpp;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
687 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
688 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
689 linkageType = LinkageType.C;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
690 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
691 case "D":
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
692 linkageType = LinkageType.D;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
693 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
694 case "Windows":
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
695 linkageType = LinkageType.Windows;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
696 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
697 case "Pascal":
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
698 linkageType = LinkageType.Pascal;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
699 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
700 case "System":
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
701 linkageType = LinkageType.System;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
702 break;
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
703 default:
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
704 error(MID.UnrecognizedLinkageType, token.srcText);
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
705 nT();
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
706 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
707 require(T.RParen);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
708 return linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
709 }
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
710
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
711 void checkLinkageType(ref LinkageType prev_lt, LinkageType lt, char* tokStart)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
712 {
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
713 if (prev_lt == LinkageType.None)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
714 prev_lt = lt;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
715 else
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
716 // TODO: create new msg RedundantLinkageType.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
717 error(MID.RedundantStorageClass, tokStart[0 .. prevToken.end - tokStart]);
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
718 }
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
719
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
720 Declaration parseStorageAttribute()
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
721 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
722 StorageClass stc, stc_tmp;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
723 LinkageType prev_linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
724
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
725 auto saved_storageClass = this.storageClass; // Save.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
726 // Nested function.
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
727 Declaration parse()
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
728 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
729 Declaration decl;
359
511c14950cac - Added messages MissingLinkageType and UnrecognizedLinkageType.
aziz
parents: 358
diff changeset
730 auto begin = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
731 switch (token.type)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
732 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
733 case T.Extern:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
734 if (peekNext() != T.LParen)
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
735 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
736 stc_tmp = StorageClass.Extern;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
737 goto Lcommon;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
738 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
739
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
740 nT();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
741 auto linkageType = parseLinkageType();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
742 checkLinkageType(prev_linkageType, linkageType, begin.start);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
743
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
744 auto saved = this.linkageType; // Save.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
745 this.linkageType = linkageType; // Set.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
746 decl = new LinkageDeclaration(linkageType, parse());
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
747 set(decl, begin);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
748 this.linkageType = saved; // Restore.
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
749 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
750 case T.Override:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
751 stc_tmp = StorageClass.Override;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
752 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
753 case T.Deprecated:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
754 stc_tmp = StorageClass.Deprecated;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
755 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
756 case T.Abstract:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
757 stc_tmp = StorageClass.Abstract;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
758 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
759 case T.Synchronized:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
760 stc_tmp = StorageClass.Synchronized;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
761 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
762 case T.Static:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
763 stc_tmp = StorageClass.Static;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
764 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
765 case T.Final:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
766 stc_tmp = StorageClass.Final;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
767 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
768 case T.Const:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
769 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
770 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
771 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
772 goto case_Declaration;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
773 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
774 stc_tmp = StorageClass.Const;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
775 goto Lcommon;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
776 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
777 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
778 case T.Invariant: // D 2.0
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
779 auto next = token;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
780 if (peekAfter(next) == T.LParen)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
781 {
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
782 if (peekAfter(next) != T.RParen)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
783 goto case_Declaration; // invariant ( Type )
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
784 decl = parseDeclarationDefinition(); // invariant ( )
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
785 decl.setStorageClass(stc);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
786 break;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
787 }
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
788 // invariant as StorageClass.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
789 stc_tmp = StorageClass.Invariant;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
790 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
791 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
792 case T.Auto:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
793 stc_tmp = StorageClass.Auto;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
794 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
795 case T.Scope:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
796 stc_tmp = StorageClass.Scope;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
797 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
798 Lcommon:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
799 // Issue error if redundant.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
800 if (stc & stc_tmp)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
801 error(MID.RedundantStorageClass, token.srcText);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
802 else
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
803 stc |= stc_tmp;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
804
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
805 auto tok = token.type;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
806 nT();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
807 decl = new StorageClassDeclaration(stc_tmp, tok, parse());
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
808 set(decl, begin);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
809 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
810 case T.Identifier:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
811 case_Declaration:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
812 // This could be a normal Declaration or an AutoDeclaration
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
813 decl = parseVariableOrFunction(stc, this.protection, prev_linkageType);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
814 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
815 default:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
816 this.storageClass = stc; // Set.
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
817 decl = parseDeclarationsBlock();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
818 this.storageClass = saved_storageClass; // Reset.
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
819 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
820 assert(isNodeSet(decl));
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
821 return decl;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
822 }
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
823 return parse();
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
824 }
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
825
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
826 uint parseAlignAttribute()
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
827 {
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
828 assert(token.type == T.Align);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
829 nT(); // Skip align keyword.
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
830 uint size = DEFAULT_ALIGN_SIZE; // Global default.
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
831 if (token.type == T.LParen)
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
832 {
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
833 nT();
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
834 if (token.type == T.Int32)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
835 (size = token.int_), nT();
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
836 else
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
837 expected(T.Int32);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
838 require(T.RParen);
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
839 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
840 return size;
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
841 }
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
842
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
843 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
844 {
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
845 Declaration decl;
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
846
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
847 switch (token.type)
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
848 {
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
849 case T.Align:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
850 uint alignSize = parseAlignAttribute();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
851 auto saved = this.alignSize; // Save.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
852 this.alignSize = alignSize; // Set.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
853 decl = new AlignDeclaration(alignSize, parseDeclarationsBlock());
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
854 this.alignSize = saved; // Restore.
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
855 break;
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
856 case T.Pragma:
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
857 // Pragma:
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
858 // pragma ( Identifier )
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
859 // pragma ( Identifier , ExpressionList )
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
860 nT();
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
861 Token* ident;
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
862 Expression[] args;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
863 Declaration decls;
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
864
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
865 require(T.LParen);
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
866 ident = requireId();
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
867
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
868 if (token.type == T.Comma)
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
869 {
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
870 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
871 args = parseExpressionList();
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
872 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
873 require(T.RParen);
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
874
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
875 if (token.type == T.Semicolon)
313
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
876 {
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
877 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
878 // TODO: call set()?
313
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
879 decls = new EmptyDeclaration();
1c1adededd8f - Fix: assign new EmptyDeclaration to decls when parsing PragmaStatement.
aziz
parents: 312
diff changeset
880 }
147
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
881 else
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
882 decls = parseDeclarationsBlock();
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
883
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
884 decl = new PragmaDeclaration(ident, args, decls);
e46b3415ec16 - Implemented parsing pragma declarations.
aziz
parents: 146
diff changeset
885 break;
491
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
886 default:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
887 // Protection attributes
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
888 Protection prot;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
889 switch (token.type)
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
890 {
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
891 case T.Private:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
892 prot = Protection.Private; break;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
893 case T.Package:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
894 prot = Protection.Package; break;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
895 case T.Protected:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
896 prot = Protection.Protected; break;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
897 case T.Public:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
898 prot = Protection.Public; break;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
899 case T.Export:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
900 prot = Protection.Export; break;
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
901 default:
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
902 assert(0);
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
903 }
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
904 nT();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
905 auto saved = this.protection; // Save.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
906 this.protection = prot; // Set.
491
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
907 decl = new ProtectionDeclaration(prot, parseDeclarationsBlock());
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
908 this.protection = saved; // Restore.
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
909 }
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
910 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
911 }
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
912
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
913 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
914 {
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
915 assert(token.type == T.Import || token.type == T.Static);
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
916
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
917 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
918
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
919 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
920 {
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
921 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
922 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
923 }
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
924
429
052cbacb1642 Fix: removed infinite loop when parsing static imports.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 424
diff changeset
925 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
926
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
927 ModuleFQN[] moduleFQNs;
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
928 Token*[] moduleAliases;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
929 Token*[] bindNames;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
930 Token*[] bindAliases;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
931
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
932 nT(); // Skip import keyword.
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
933 while (1)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
934 {
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
935 ModuleFQN moduleFQN;
263
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
936 Token* moduleAlias;
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
937
ebcf7941f1db - Changed some string types to Token*.
aziz
parents: 262
diff changeset
938 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
939
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
940 // AliasName = ModuleName
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
941 if (token.type == T.Assign)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
942 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
943 nT();
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
944 moduleFQN ~= requireId();
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
945 }
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
946 else // import Identifier [^=]
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
947 {
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
948 moduleFQN ~= moduleAlias;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
949 moduleAlias = null;
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
950 }
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
951
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
952 // Identifier(.Identifier)*
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
953 while (token.type == T.Dot)
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
954 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
955 nT();
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
956 moduleFQN ~= requireId();
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
957 }
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
958
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
959 // Push identifiers.
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 359
diff changeset
960 moduleFQNs ~= moduleFQN;
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
961 moduleAliases ~= moduleAlias;
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
962
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
963 if (token.type != T.Comma)
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
964 break;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
965 nT();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
966 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
967
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
968 if (token.type == T.Colon)
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
969 {
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
970 // BindAlias = BindName(, BindAlias = BindName)*;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
971 // BindName(, BindName)*;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
972 Token* bindName, bindAlias;
320
0ce14640eb04 - Fix in parseImportDeclaration(): rewrote while loop and removed a call to nT().
aziz
parents: 319
diff changeset
973 do
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
974 {
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
975 nT();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
976 bindAlias = requireId();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
977
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
978 if (token.type == T.Assign)
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
979 {
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
980 nT();
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
981 bindName = requireId();
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
982 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
983 else
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
984 {
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
985 bindName = bindAlias;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
986 bindAlias = null;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
987 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
988
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
989 // Push identifiers.
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
990 bindNames ~= bindName;
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
991 bindAliases ~= bindAlias;
320
0ce14640eb04 - Fix in parseImportDeclaration(): rewrote while loop and removed a call to nT().
aziz
parents: 319
diff changeset
992 } while (token.type == T.Comma)
298
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
993 }
dc8bed242db5 - Fixed parsing ImportDeclaration.
aziz
parents: 297
diff changeset
994
114
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
995 require(T.Semicolon);
83bb5190c0fc - Completed implementation of parseImportDeclaration().
aziz
parents: 113
diff changeset
996
366
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 364
diff changeset
997 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
998 }
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
999
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1000 Declaration parseEnumDeclaration()
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1001 {
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1002 assert(token.type == T.Enum);
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1003
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1004 Token* enumName;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1005 Type baseType;
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1006 EnumMember[] members;
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1007 bool hasBody;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1008
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1009 nT(); // Skip enum keyword.
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1010
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1011 if (token.type == T.Identifier)
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1012 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1013 enumName = token;
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1014 nT();
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1015 }
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1016
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1017 if (token.type == T.Colon)
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1018 {
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1019 nT();
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1020 baseType = parseBasicType();
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1021 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1022
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1023 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
1024 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1025 if (enumName is null)
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1026 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
1027 nT();
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1028 }
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1029 else if (token.type == T.LBrace)
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1030 {
126
0f0e7352e91d - Renamed member hasDefinition of class Declaration to hasBody.
aziz
parents: 125
diff changeset
1031 hasBody = true;
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1032 nT(); // Skip {
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1033 while (token.type != T.RBrace)
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1034 {
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1035 auto begin = token;
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1036 auto memberName = requireId();
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1037 Expression value;
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1038
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1039 if (token.type == T.Assign)
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1040 {
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1041 nT();
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1042 value = parseAssignExpression();
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1043 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1044 else
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1045 value = null;
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1046
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1047 members ~= set(new EnumMember(memberName, value), begin);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1048
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1049 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
1050 break;
398
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1051 nT(); // Skip ,
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1052 }
f7bb892d64c2 Fixed Parser.parseEnumDeclaration(): empty enums are allowed now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
1053 require(T.RBrace);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1054 }
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1055 else
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1056 error(MID.ExpectedButFound, "enum declaration", token.srcText);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1057
406
e242f0ee2d27 Added class EnumMember.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 405
diff changeset
1058 return new EnumDeclaration(enumName, baseType, members, hasBody);
107
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1059 }
722c05bbd5eb - Implemented parseEnumDeclaration() and added class EnumDeclaration.
aziz
parents: 106
diff changeset
1060
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1061 Declaration parseClassDeclaration()
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1062 {
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1063 assert(token.type == T.Class);
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1064
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1065 Token* className;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1066 TemplateParameters tparams;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1067 BaseClass[] bases;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1068 Declarations decls;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1069
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1070 nT(); // Skip class keyword.
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1071 className = requireId();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1072
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1073 if (token.type == T.LParen)
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1074 tparams = parseTemplateParameterList();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1075
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1076 if (token.type == T.Colon)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1077 bases = parseBaseClasses();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1078
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1079 if (token.type == T.Semicolon)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1080 {
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1081 if (bases.length != 0)
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1082 error(MID.BaseClassInForwardDeclaration);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1083 nT();
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1084 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1085 else if (token.type == T.LBrace)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1086 decls = parseDeclarationDefinitionsBody();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1087 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1088 expected(T.LBrace); // TODO: better error msg
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1089
494
9a7ca8c56e59 Refactored a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 493
diff changeset
1090 return new ClassDeclaration(className, tparams, bases, decls);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1091 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1092
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1093 BaseClass[] parseBaseClasses(bool colonLeadsOff = true)
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1094 {
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1095 if (colonLeadsOff)
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1096 {
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1097 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
1098 nT(); // Skip colon
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
1099 }
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1100
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1101 BaseClass[] bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1102
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1103 while (1)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1104 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1105 Protection prot = Protection.Public;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1106 switch (token.type)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1107 {
204
082f30904456 - Allowing 'typeof' in BaseClassList.
aziz
parents: 203
diff changeset
1108 case T.Identifier, T.Dot, T.Typeof: goto LparseBasicType;
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1109 case T.Private: prot = Protection.Private; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1110 case T.Protected: prot = Protection.Protected; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1111 case T.Package: prot = Protection.Package; break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1112 case T.Public: /*prot = Protection.Public;*/ break;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1113 default:
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1114 error(MID.ExpectedBaseClasses, token.srcText);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1115 return bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1116 }
158
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1117 nT(); // Skip protection attribute.
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1118 LparseBasicType:
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1119 auto begin = token;
158
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1120 auto type = parseBasicType();
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1121 //if (type.tid != TID.DotList)
759f437313f9 - Moved enum Protection and class BaseClass to module Types.
aziz
parents: 157
diff changeset
1122 // 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
1123 bases ~= set(new BaseClass(prot, type), begin);
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1124 if (token.type != T.Comma)
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1125 break;
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
1126 nT();
109
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1127 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1128 return bases;
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1129 }
d0cc281cacbd - Added methods parseClassDeclaration() and parseBaseClasses().
aziz
parents: 108
diff changeset
1130
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1131 Declaration parseInterfaceDeclaration()
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1132 {
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1133 assert(token.type == T.Interface);
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1134
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1135 Token* name;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1136 TemplateParameters tparams;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1137 BaseClass[] bases;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1138 Declarations decls;
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1139
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1140 nT(); // Skip interface keyword.
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1141 name = requireId();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1142
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1143 if (token.type == T.LParen)
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1144 tparams = parseTemplateParameterList();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1145
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1146 if (token.type == T.Colon)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1147 bases = parseBaseClasses();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1148
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1149 if (token.type == T.Semicolon)
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1150 {
405
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1151 if (bases.length != 0)
e2529923a0cb Added two error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 404
diff changeset
1152 error(MID.BaseClassInForwardDeclaration);
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1153 nT();
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1154 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1155 else if (token.type == T.LBrace)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1156 decls = parseDeclarationDefinitionsBody();
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1157 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1158 expected(T.LBrace); // TODO: better error msg
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1159
494
9a7ca8c56e59 Refactored a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 493
diff changeset
1160 return new InterfaceDeclaration(name, tparams, bases, decls);
112
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1161 }
004d98df65af - Implemented parseInterfaceDeclaration().
aziz
parents: 111
diff changeset
1162
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1163 Declaration parseAggregateDeclaration()
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1164 {
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1165 assert(token.type == T.Struct || token.type == T.Union);
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1166
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1167 TOK tok = token.type;
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1168
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1169 Token* name;
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
1170 TemplateParameters tparams;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1171 Declarations decls;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1172
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1173 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
1174 // name is optional.
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1175 if (token.type == T.Identifier)
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1176 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1177 name = token;
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1178 nT();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1179 if (token.type == T.LParen)
195
37c2ffd649c4 - Parsing template parameter list for class, interface, struct and union declarations.
aziz
parents: 194
diff changeset
1180 tparams = parseTemplateParameterList();
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1181 }
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1182
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1183 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
1184 {
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1185 //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
1186 // TODO: error: forward declarations must have a name.
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1187 nT();
115
cea36caeec42 - Added method requireIdentifier(). Removed if-else-statements which checked for T.Identifier and replaced with requireIdentifier().
aziz
parents: 114
diff changeset
1188 }
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1189 else if (token.type == T.LBrace)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1190 decls = parseDeclarationDefinitionsBody();
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1191 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1192 expected(T.LBrace); // TODO: better error msg
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1193
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1194 if (tok == T.Struct)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1195 {
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1196 auto d = new StructDeclaration(name, tparams, decls);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1197 d.setAlignSize(this.alignSize);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1198 return d;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1199 }
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1200 else
494
9a7ca8c56e59 Refactored a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 493
diff changeset
1201 return new UnionDeclaration(name, tparams, decls);
113
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1202 }
20d8ae8a3fd9 - Implemented parseAggregateDeclaration for Struct- and UnionDeclarations.
aziz
parents: 112
diff changeset
1203
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1204 Declaration parseConstructorDeclaration()
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1205 {
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1206 assert(token.type == T.This);
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1207 nT(); // Skip 'this' keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1208 auto parameters = parseParameterList();
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1209 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1210 return new ConstructorDeclaration(parameters, funcBody);
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1211 }
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
1212
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1213 Declaration parseDestructorDeclaration()
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1214 {
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1215 assert(token.type == T.Tilde);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1216 nT(); // Skip ~
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1217 require(T.This);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1218 require(T.LParen);
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1219 require(T.RParen);
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 DestructorDeclaration(funcBody);
118
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1222 }
379f33cbd521 - Added parseDestructorDeclaration() and DestructorDeclaration class.
aziz
parents: 117
diff changeset
1223
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1224 Declaration parseStaticConstructorDeclaration()
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1225 {
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1226 assert(token.type == T.Static);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1227 nT(); // Skip static keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1228 nT(); // Skip 'this' keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1229 require(T.LParen);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1230 require(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1231 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1232 return new StaticConstructorDeclaration(funcBody);
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1233 }
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1234
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1235 Declaration parseStaticDestructorDeclaration()
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1236 {
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1237 assert(token.type == T.Static);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1238 nT(); // Skip static keyword.
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1239 nT(); // Skip ~
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1240 require(T.This);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1241 require(T.LParen);
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1242 require(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1243 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1244 return new StaticDestructorDeclaration(funcBody);
119
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1245 }
363cd39022f9 - Added parseStaticConstructor- and DestructorDeclaration().
aziz
parents: 118
diff changeset
1246
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1247 Declaration parseInvariantDeclaration()
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1248 {
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1249 assert(token.type == T.Invariant);
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1250 nT(); // Skip invariant keyword.
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1251 // Optional () for getting ready porting to D 2.0
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1252 if (token.type == T.LParen)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1253 requireNext(T.RParen);
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1254 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1255 return new InvariantDeclaration(funcBody);
120
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1256 }
e5329dac0405 - Added parseInvariantDeclaration().
aziz
parents: 119
diff changeset
1257
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1258 Declaration parseUnittestDeclaration()
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1259 {
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1260 assert(token.type == T.Unittest);
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1261
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1262 nT(); // Skip unittest keyword.
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1263 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1264 return new UnittestDeclaration(funcBody);
121
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1265 }
030933c6b5f0 - Added parseUnittestDeclaration().
aziz
parents: 120
diff changeset
1266
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1267 Declaration parseDebugDeclaration()
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1268 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1269 assert(token.type == T.Debug);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1270
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1271 nT(); // Skip debug keyword.
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1272
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1273 Token* spec; // debug = Integer ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1274 // debug = Identifier ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1275 Token* cond; // debug ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1276 // debug ( Identifier )
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1277 Declaration decls, elseDecls;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1278
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1279 void parseIdentOrInt(ref Token* tok)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1280 {
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1281 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1282 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1283 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1284 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1285 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1286 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1287 }
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1288 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1289 expected(T.Identifier); // TODO: better error msg
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1290 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1291
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1292 if (token.type == T.Assign)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1293 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1294 parseIdentOrInt(spec);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1295 require(T.Semicolon);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1296 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1297 else
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1298 {
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1299 // Condition:
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1300 // Integer
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1301 // Identifier
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1302 // ( Condition )
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1303 if (token.type == T.LParen)
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1304 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1305 parseIdentOrInt(cond);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1306 require(T.RParen);
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1307 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1308
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1309 // debug DeclarationsBlock
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1310 // debug ( Condition ) DeclarationsBlock
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1311 decls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1312
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1313 // else DeclarationsBlock
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1314 if (token.type == T.Else)
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1315 {
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1316 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1317 elseDecls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1318 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1319 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1320
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1321 return new DebugDeclaration(spec, cond, decls, elseDecls);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1322 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1323
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1324 Declaration parseVersionDeclaration()
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1325 {
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1326 assert(token.type == T.Version);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1327
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1328 nT(); // Skip version keyword.
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1329
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1330 Token* spec; // version = Integer ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1331 // version = Identifier ;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1332 Token* cond; // version ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1333 // version ( Identifier )
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1334 Declaration decls, elseDecls;
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1335
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1336 void parseIdentOrInt(ref Token* tok)
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1337 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1338 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1339 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1340 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1341 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1342 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1343 }
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1344 else
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
1345 expected(T.Identifier); // TODO: better error msg
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1346 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1347
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1348 if (token.type == T.Assign)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1349 {
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1350 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1351 parseIdentOrInt(spec);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1352 require(T.Semicolon);
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1353 }
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1354 else
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1355 {
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1356 // Condition:
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1357 // Integer
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1358 // Identifier
146
8180eb84e69c - Started implementation of parseAttributeSpecifier().
aziz
parents: 145
diff changeset
1359
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1360 // ( Condition )
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1361 require(T.LParen);
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1362 parseIdentOrInt(cond);
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1363 require(T.RParen);
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1364
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1365 // version ( Condition ) DeclarationsBlock
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1366 decls = parseDeclarationsBlockNoColon();
123
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1367
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1368 // else DeclarationsBlock
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1369 if (token.type == T.Else)
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1370 {
0f55c0ac6589 - Added method parseVersionDeclaration().
aziz
parents: 122
diff changeset
1371 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1372 elseDecls = parseDeclarationsBlockNoColon();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1373 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1374 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1375
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1376 return new VersionDeclaration(spec, cond, decls, elseDecls);
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1377 }
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
1378
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1379 Declaration parseStaticIfDeclaration()
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1380 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1381 assert(token.type == T.Static);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1382
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1383 nT(); // Skip static keyword.
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1384 nT(); // Skip if keyword.
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1385
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1386 Expression condition;
305
df237b3b5f09 - Added class Declarations.
aziz
parents: 304
diff changeset
1387 Declaration ifDecls, elseDecls;
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1388
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1389 require(T.LParen);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1390 condition = parseAssignExpression();
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1391 require(T.RParen);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1392
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1393 ifDecls = parseDeclarationsBlockNoColon();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1394
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1395 if (token.type == T.Else)
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1396 {
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1397 nT();
404
fe46b5ea7a18 Added method parseDeclarationsBlockNoColon().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 400
diff changeset
1398 elseDecls = parseDeclarationsBlockNoColon();
125
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1399 }
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1400
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1401 return new StaticIfDeclaration(condition, ifDecls, elseDecls);
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1402 }
240a8b053803 - Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
aziz
parents: 124
diff changeset
1403
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1404 Declaration parseStaticAssertDeclaration()
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1405 {
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1406 assert(token.type == T.Static);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1407
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1408 nT(); // Skip static keyword.
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1409 nT(); // Skip assert keyword.
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1410
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1411 Expression condition, message;
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1412
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1413 require(T.LParen);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1414
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1415 condition = parseAssignExpression();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1416
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1417 if (token.type == T.Comma)
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1418 {
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1419 nT();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1420 message = parseAssignExpression();
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1421 }
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1422
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1423 require(T.RParen);
128
e02b87281b4e - Static asserts have to end with a semicolon.
aziz
parents: 127
diff changeset
1424 require(T.Semicolon);
127
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1425
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1426 return new StaticAssertDeclaration(condition, message);
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1427 }
cb9a97ebb570 - Added method parseStaticAssertDeclaration and added class StaticAssertDeclaration.
aziz
parents: 126
diff changeset
1428
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1429 Declaration parseTemplateDeclaration()
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1430 {
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1431 assert(token.type == T.Template);
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1432 nT(); // Skip template keyword.
265
3a2a0a63c638 - Changed some string types to Token*.
aziz
parents: 264
diff changeset
1433 auto templateName = requireId();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1434 auto templateParams = parseTemplateParameterList();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1435 auto decls = parseDeclarationDefinitionsBody();
140
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1436 return new TemplateDeclaration(templateName, templateParams, decls);
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1437 }
64d7186b087c - Implemented parseTemplateParameters().
aziz
parents: 139
diff changeset
1438
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1439 Declaration parseNewDeclaration()
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1440 {
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1441 assert(token.type == T.New);
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1442 nT(); // Skip new keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1443 auto parameters = parseParameterList();
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
1444 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1445 return new NewDeclaration(parameters, funcBody);
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1446 }
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1447
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1448 Declaration parseDeleteDeclaration()
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1449 {
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1450 assert(token.type == T.Delete);
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1451 nT(); // Skip delete keyword.
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
1452 auto parameters = parseParameterList();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1453 // 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
1454 auto funcBody = parseFunctionBody();
197
ff32eb87300e - Using parseFunctionBody() for Constructor-,Destructor-,StaticConstructor-,StaticDestructor-,Invariant-,Unittest-,New- and DeleteDeclaration.
aziz
parents: 196
diff changeset
1455 return new DeleteDeclaration(parameters, funcBody);
141
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1456 }
7ab33ee1a641 - Implemented parseNew- and DeleteDeclaration().
aziz
parents: 140
diff changeset
1457
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1458 Type parseTypeofType()
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1459 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1460 assert(token.type == T.Typeof);
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1461 Type type;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1462 requireNext(T.LParen);
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1463 switch (token.type)
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1464 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1465 version(D2)
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1466 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1467 case T.Return:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1468 nT();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1469 type = new TypeofType();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1470 break;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1471 }
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1472 default:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1473 type = new TypeofType(parseExpression());
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1474 }
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1475 require(T.RParen);
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1476 return type;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1477 }
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1478
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1479 /+
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1480 DotListExpression:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1481 . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1482 DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1483 Typeof
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1484 Typeof . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1485 DotListItems:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1486 DotListItem
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1487 DotListItem . DotListItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1488 DotListItem:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1489 Identifier
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1490 TemplateInstance
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1491 NewExpression
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1492 TemplateInstance:
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1493 Identifier !( TemplateArguments )
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1494 +/
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1495 DotListExpression parseDotListExpression()
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1496 {
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1497 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
1498 auto begin = token;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1499 Expression[] identList;
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1500 if (token.type == T.Dot)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1501 {
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1502 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1503 identList ~= set(new DotExpression(), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1504 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1505 else if (token.type == T.Typeof)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1506 {
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1507 auto type = parseTypeofType();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1508 set(type, begin);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1509 identList ~= set(new TypeofExpression(type), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1510 if (token.type != T.Dot)
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1511 goto Lreturn;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1512 nT();
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1513 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1514
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1515 while (1)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1516 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1517 begin = token;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1518 auto ident = requireId();
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1519 Expression e;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1520 if (token.type == T.Not && peekNext() == T.LParen) // Identifier !( TemplateArguments )
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1521 {
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1522 nT(); // Skip !.
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1523 e = set(new TemplateInstanceExpression(ident, parseTemplateArguments()), begin);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1524 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1525 else // Identifier
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1526 e = set(new IdentifierExpression(ident), begin);
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1527
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1528 identList ~= e;
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1529
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1530 LnewExpressionLoop:
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1531 if (token.type != T.Dot)
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1532 break;
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1533 nT(); // Skip dot.
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1534
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1535 if (token.type == T.New)
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1536 {
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1537 identList ~= parseNewExpression();
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1538 goto LnewExpressionLoop;
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1539 }
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1540 }
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1541
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1542 Lreturn:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1543 return new DotListExpression(identList);
152
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1544 }
fe2e36eb4b45 - Added method parseIdentifierListExpression() and class IdentifierListExpression.
aziz
parents: 151
diff changeset
1545
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1546 /+
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1547 DotListType:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1548 . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1549 TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1550 Typeof
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1551 Typeof . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1552 TypeItems:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1553 TypeItem
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1554 TypeItem . TypeItems
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1555 TypeItem:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1556 Identifier
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1557 TemplateInstance
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1558 TemplateInstance:
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1559 Identifier !( TemplateArguments )
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1560 +/
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1561 DotListType parseDotListType()
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1562 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1563 auto begin = token;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1564 Type[] identList;
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1565 if (token.type == T.Dot)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1566 {
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1567 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1568 identList ~= set(new DotType(), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1569 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1570 else if (token.type == T.Typeof)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1571 {
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
1572 identList ~= set(parseTypeofType(), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1573 if (token.type != T.Dot)
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1574 goto Lreturn;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1575 nT();
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1576 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1577
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1578 while (1)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1579 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1580 begin = token;
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1581 auto ident = requireId();
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1582 // 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
1583 if (token.type == T.Not/+ && peekNext() == T.LParen+/) // Identifier !( TemplateArguments )
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1584 {
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1585 nT(); // Skip !.
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1586 identList ~= set(new TemplateInstanceType(ident, parseTemplateArguments()), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1587 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1588 else // Identifier
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1589 identList ~= set(new IdentifierType(ident), begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1590
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1591 if (token.type != T.Dot)
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1592 break;
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1593 nT();
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1594 }
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1595 Lreturn:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
1596 return new DotListType(identList);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1597 }
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
1598
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1599 /*
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1600 TemplateMixin:
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1601 mixin ( AssignExpression ) ;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1602 mixin TemplateIdentifier ;
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1603 mixin TemplateIdentifier MixinIdentifier ;
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1604 mixin TemplateIdentifier !( TemplateArguments ) ;
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
1605 mixin TemplateIdentifier !( TemplateArguments ) MixinIdentifier ;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1606 */
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1607 Class parseMixin(Class)()
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1608 {
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1609 assert(token.type == T.Mixin);
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1610 auto begin = token;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1611 nT(); // Skip mixin keyword.
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1612
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1613 static if (is(Class == MixinDeclaration))
301
caef255a2801 - Fix in some ctors: adding only non-null members to this.children.
aziz
parents: 299
diff changeset
1614 {
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1615 if (token.type == T.LParen)
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1616 {
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1617 // TODO: What about mixin(...).ident;?
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1618 nT();
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1619 auto e = parseAssignExpression();
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1620 require(T.RParen);
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1621 require(T.Semicolon);
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1622 return new MixinDeclaration(e);
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1623 }
301
caef255a2801 - Fix in some ctors: adding only non-null members to this.children.
aziz
parents: 299
diff changeset
1624 }
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1625
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1626 Expression[] templateIdent;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1627 Token* mixinIdent;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1628
159
5aa877506db0 - Added enum Linkage.
aziz
parents: 158
diff changeset
1629 // This code is similar to parseDotListType().
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1630 if (token.type == T.Dot)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1631 {
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1632 nT();
488
cfb3805768b6 Added DotExpression and DotType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 486
diff changeset
1633 templateIdent ~= set(new DotExpression(), begin);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1634 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1635
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1636 while (1)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1637 {
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1638 begin = token;
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1639 auto ident = requireId();
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1640 Expression e;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1641 if (token.type == T.Not) // Identifier !( TemplateArguments )
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1642 {
151
2e959f67000b - Added code for parsing mixin expression declarations.
aziz
parents: 150
diff changeset
1643 // 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
1644 nT();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1645 e = set(new TemplateInstanceExpression(ident, parseTemplateArguments()), begin);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1646 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1647 else // Identifier
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
1648 e = set(new IdentifierExpression(ident), begin);
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1649
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1650 templateIdent ~= e;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1651
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1652 if (token.type != T.Dot)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1653 break;
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1654 nT();
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1655 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1656
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1657 if (token.type == T.Identifier)
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1658 {
252
788398655d24 - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 251
diff changeset
1659 mixinIdent = token;
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1660 nT();
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1661 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1662
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1663 require(T.Semicolon);
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1664
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1665 return new Class(templateIdent, mixinIdent);
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1666 }
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
1667
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
1668 /+++++++++++++++++++++++++++++
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1669 + Statement parsing methods +
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1670 +++++++++++++++++++++++++++++/
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1671
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1672 Statements parseStatements()
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1673 {
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1674 auto begin = token;
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
1675 require(T.LBrace);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1676 auto statements = new Statements();
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1677 while (token.type != T.RBrace && token.type != T.EOF)
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1678 statements ~= parseStatement();
318
a1c9d93a66e3 - Added member prevToken to Parser.
aziz
parents: 314
diff changeset
1679 require(T.RBrace);
262
0f22269e76ff - Changed some string types to Token*.
aziz
parents: 261
diff changeset
1680 return set(statements, begin);
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1681 }
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1682
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1683 Statement parseStatement()
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1684 {
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1685 auto begin = token;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1686 Statement s;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1687 Declaration d;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1688 switch (token.type)
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1689 {
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1690 case T.Align:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1691 uint size = parseAlignAttribute();
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1692 // Restrict align attribute to structs in parsing phase.
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1693 StructDeclaration structDecl;
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1694 if (token.type == T.Struct)
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1695 {
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1696 auto begin2 = token;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1697 structDecl = CastTo!(StructDeclaration)(parseAggregateDeclaration());
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1698 structDecl.setAlignSize(size);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1699 set(structDecl, begin2);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1700 }
260
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1701 else
b83180748ae6 - Added method parseAlignAttribute().
aziz
parents: 259
diff changeset
1702 expected(T.Struct);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1703
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1704 d = new AlignDeclaration(size, structDecl ? cast(Declaration)structDecl : new Declarations);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1705 goto LreturnDeclarationStatement;
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1706 /+ Not applicable for statements.
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1707 // T.Private,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1708 // T.Package,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1709 // T.Protected,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1710 // T.Public,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1711 // T.Export,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1712 // T.Deprecated,
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1713 // T.Override,
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1714 // T.Abstract,
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1715 +/
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1716 case T.Extern,
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1717 T.Final,
191
3ce110cefbc5 - Added code for parsing AliasDeclaration and TypedefDeclaration.
aziz
parents: 190
diff changeset
1718 T.Const,
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1719 T.Auto:
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1720 //T.Scope
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1721 //T.Static
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1722 case_parseAttribute:
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1723 s = parseAttributeStatement();
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1724 return s;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1725 case T.Identifier:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1726 if (peekNext() == T.Colon)
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1727 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
1728 auto ident = token;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1729 nT(); // Skip Identifier
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1730 nT(); // Skip :
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1731 s = new LabeledStatement(ident, parseNoScopeOrEmptyStatement());
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1732 break;
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1733 }
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1734 goto case T.Dot;
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1735 case T.Dot, T.Typeof:
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
1736 bool success;
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1737 d = try_(delegate {
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1738 return parseVariableOrFunction(StorageClass.None, Protection.None, LinkageType.None, false);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1739 }, success
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1740 );
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
1741 if (success)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1742 goto LreturnDeclarationStatement; // Declaration
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1743 else
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1744 goto case_parseExpressionStatement; // Expression
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1745 // IntegralType
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1746 case T.Char, T.Wchar, T.Dchar, T.Bool,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1747 T.Byte, T.Ubyte, T.Short, T.Ushort,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1748 T.Int, T.Uint, T.Long, T.Ulong,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1749 T.Float, T.Double, T.Real,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1750 T.Ifloat, T.Idouble, T.Ireal,
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1751 T.Cfloat, T.Cdouble, T.Creal, T.Void:
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1752 case_parseDeclaration:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
1753 d = parseVariableOrFunction();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1754 goto LreturnDeclarationStatement;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1755 case T.If:
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1756 s = parseIfStatement();
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1757 break;
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1758 case T.While:
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1759 s = parseWhileStatement();
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1760 break;
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1761 case T.Do:
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1762 s = parseDoWhileStatement();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
1763 break;
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1764 case T.For:
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1765 s = parseForStatement();
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1766 break;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1767 case T.Foreach, T.Foreach_reverse:
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1768 s = parseForeachStatement();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
1769 break;
170
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1770 case T.Switch:
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1771 s = parseSwitchStatement();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
1772 break;
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1773 case T.Case:
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1774 s = parseCaseStatement();
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
1775 break;
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1776 case T.Default:
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1777 s = parseDefaultStatement();
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
1778 break;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1779 case T.Continue:
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1780 s = parseContinueStatement();
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
1781 break;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1782 case T.Break:
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1783 s = parseBreakStatement();
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
1784 break;
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1785 case T.Return:
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1786 s = parseReturnStatement();
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
1787 break;
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1788 case T.Goto:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1789 s = parseGotoStatement();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
1790 break;
177
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1791 case T.With:
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1792 s = parseWithStatement();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
1793 break;
178
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1794 case T.Synchronized:
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1795 s = parseSynchronizedStatement();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
1796 break;
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1797 case T.Try:
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1798 s = parseTryStatement();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
1799 break;
180
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1800 case T.Throw:
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1801 s = parseThrowStatement();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
1802 break;
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1803 case T.Scope:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1804 if (peekNext() != T.LParen)
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1805 goto case_parseAttribute;
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1806 s = parseScopeGuardStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
1807 break;
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1808 case T.Volatile:
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1809 s = parseVolatileStatement();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
1810 break;
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1811 case T.Asm:
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1812 s = parseAsmStatement();
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
1813 break;
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1814 case T.Pragma:
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1815 s = parsePragmaStatement();
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
1816 break;
185
35c93b776be0 - Added code for parsing MixinStatements.
aziz
parents: 184
diff changeset
1817 case T.Mixin:
246
52f4aa097865 - Fix: parse mixin as expression instead of statement when next token is T.LParen.
aziz
parents: 245
diff changeset
1818 if (peekNext() == T.LParen)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1819 goto case_parseExpressionStatement; // Parse as expression.
256
8f27920ae17a - Made parseMixinDeclaration() a template.
aziz
parents: 255
diff changeset
1820 s = parseMixin!(MixinStatement)();
185
35c93b776be0 - Added code for parsing MixinStatements.
aziz
parents: 184
diff changeset
1821 break;
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1822 case T.Static:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1823 switch (peekNext())
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1824 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1825 case T.If:
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1826 s = parseStaticIfStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1827 break;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1828 case T.Assert:
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1829 s = parseStaticAssertStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1830 break;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1831 default:
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1832 goto case_parseAttribute;
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
1833 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
1834 break;
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1835 case T.Debug:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1836 s = parseDebugStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1837 break;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1838 case T.Version:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1839 s = parseVersionStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
1840 break;
226
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1841 // DeclDef
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1842 case T.Alias, T.Typedef:
aa38e1401217 - Fixed cases T.Alias and T.Typedef. Wrong function called.
aziz
parents: 225
diff changeset
1843 d = parseDeclarationDefinition();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1844 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1845 case T.Enum:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1846 d = parseEnumDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1847 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1848 case T.Class:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1849 d = parseClassDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1850 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1851 case T.Interface:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1852 d = parseInterfaceDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1853 goto LreturnDeclarationStatement;
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1854 case T.Struct, T.Union:
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1855 d = parseAggregateDeclaration();
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1856 // goto LreturnDeclarationStatement;
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1857 LreturnDeclarationStatement:
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1858 set(d, begin);
188
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1859 s = new DeclarationStatement(d);
5c6ebf9f60a9 - Added code for parsing DeclarationStatement.
aziz
parents: 187
diff changeset
1860 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1861 case T.LBrace:
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1862 s = parseScopeStatement();
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
1863 break;
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1864 case T.Semicolon:
231
6846138a0e24 - Fixed parseEnumDeclaration().
aziz
parents: 230
diff changeset
1865 nT();
216
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1866 s = new EmptyStatement();
984d48932bce - Added class EmptyStatement.
aziz
parents: 214
diff changeset
1867 break;
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1868 /+
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1869 Parse ExpressionStatement:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1870 +/
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1871 // 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
1872 // 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
1873 case T.This:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1874 case T.Super:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1875 case T.Null:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1876 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
1877 // case T.Dollar:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1878 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
1879 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
1880 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
1881 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
1882 case T.String:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1883 case T.LBracket:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1884 // case T.LBrace:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1885 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
1886 case T.Assert:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1887 // case T.Mixin:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1888 case T.Import:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1889 case T.Typeid:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1890 case T.Is:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1891 case T.LParen:
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1892 // IntegralType
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1893 /+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
1894 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
1895 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
1896 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
1897 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
1898 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
1899 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
1900 // 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
1901 case T.AndBinary,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1902 T.PlusPlus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1903 T.MinusMinus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1904 T.Mul,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1905 T.Minus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1906 T.Plus,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1907 T.Not,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1908 T.Tilde,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1909 T.New,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1910 T.Delete,
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1911 T.Cast:
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1912 case_parseExpressionStatement:
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1913 s = new ExpressionStatement(parseExpression());
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1914 require(T.Semicolon);
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1915 break;
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1916 default:
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1917 if (token.isSpecialToken)
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
1918 goto case_parseExpressionStatement;
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1919
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1920 if (token.type != T.Dollar)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1921 // 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
1922 assert(
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1923 delegate bool(){
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1924 bool success;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1925 auto expression = try_(&parseExpression, success);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1926 return success;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1927 }() == 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
1928 );
400
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1929
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1930 // 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
1931 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
1932 s = new IllegalStatement(token);
a0fa0dcfa50a Added case statements to switch in Parser.parseStatement().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 399
diff changeset
1933 nT();
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1934 }
205
e5a4f88982d1 - Added assert at the end of parseStatement().
aziz
parents: 204
diff changeset
1935 assert(s !is null);
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
1936 set(s, begin);
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1937 return s;
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1938 }
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
1939
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1940 /++
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1941 ScopeStatement:
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1942 NoScopeStatement
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1943 +/
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
1944 Statement parseScopeStatement()
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1945 {
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1946 return new ScopeStatement(parseNoScopeStatement());
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1947 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
1948
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1949 /++
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1950 NoScopeStatement:
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1951 NonEmptyStatement
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1952 BlockStatement
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1953 BlockStatement:
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1954 { }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1955 { StatementList }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1956 +/
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1957 Statement parseNoScopeStatement()
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1958 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1959 auto begin = token;
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1960 Statement s;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1961 if (token.type == T.LBrace)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1962 {
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1963 nT();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1964 auto ss = new Statements();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1965 while (token.type != T.RBrace && token.type != T.EOF)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1966 ss ~= parseStatement();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1967 require(T.RBrace);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1968 s = set(ss, begin);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1969 }
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1970 else if (token.type == T.Semicolon)
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1971 {
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1972 error(MID.ExpectedButFound, "non-empty statement", ";");
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1973 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1974 s = set(new EmptyStatement(), begin);
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
1975 }
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1976 else
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1977 s = parseStatement();
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1978 return s;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1979 }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
1980
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1981 /++
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1982 NoScopeOrEmptyStatement:
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1983 ;
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1984 NoScopeStatement
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1985 +/
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1986 Statement parseNoScopeOrEmptyStatement()
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1987 {
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1988 if (token.type == T.Semicolon)
312
fa0b6f32c1ae - Added Special to enum TOK.
aziz
parents: 305
diff changeset
1989 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1990 auto begin = token;
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1991 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
1992 return set(new EmptyStatement(), begin);
312
fa0b6f32c1ae - Added Special to enum TOK.
aziz
parents: 305
diff changeset
1993 }
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1994 else
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1995 return parseNoScopeStatement();
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1996 }
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
1997
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1998 Statement parseAttributeStatement()
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
1999 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2000 StorageClass stc, stc_tmp;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2001 LinkageType prev_linkageType;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2002
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2003 // Nested function.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2004 Declaration parse()
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2005 {
261
966756c5d5d3 - Added begin variables and calls to set().
aziz
parents: 260
diff changeset
2006 auto begin = token;
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2007 Declaration d;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2008 switch (token.type)
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2009 {
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2010 case T.Extern:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2011 if (peekNext() != T.LParen)
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2012 {
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2013 stc_tmp = StorageClass.Extern;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2014 goto Lcommon;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2015 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2016
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2017 nT();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2018 auto linkageType = parseLinkageType();
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2019 checkLinkageType(prev_linkageType, linkageType, begin.start);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2020
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2021 d = new LinkageDeclaration(linkageType, parse());
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2022 break;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2023 case T.Static:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2024 stc_tmp = StorageClass.Static;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2025 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2026 case T.Final:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2027 stc_tmp = StorageClass.Final;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2028 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2029 case T.Const:
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2030 version(D2)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2031 {
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2032 if (peekNext() == T.LParen)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2033 goto case_Declaration;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2034 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2035 stc_tmp = StorageClass.Const;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2036 goto Lcommon;
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2037 version(D2)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2038 {
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2039 case T.Invariant: // D 2.0
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2040 if (peekNext() == T.LParen)
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2041 goto case_Declaration;
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2042 stc_tmp = StorageClass.Invariant;
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2043 goto Lcommon;
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2044 }
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2045 case T.Auto:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2046 stc_tmp = StorageClass.Auto;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2047 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2048 case T.Scope:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2049 stc_tmp = StorageClass.Scope;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2050 goto Lcommon;
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2051 Lcommon:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2052 // Issue error if redundant.
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2053 if (stc & stc_tmp)
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2054 error(MID.RedundantStorageClass, token.srcText);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2055 else
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2056 stc |= stc_tmp;
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2057
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2058 auto tok = token.type;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2059 nT();
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2060 d = new StorageClassDeclaration(stc_tmp, tok, parse());
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2061 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
2062 // 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
2063 //case T.Class:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2064 default:
270
764eccdf619d - Fix in parseAttributeStatement(): added checks for T.LParen after const/invariant.
aziz
parents: 269
diff changeset
2065 case_Declaration:
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2066 return parseVariableOrFunction(stc, Protection.None, prev_linkageType);
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2067 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2068 return set(d, begin);
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2069 }
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2070 return new DeclarationStatement(parse());
201
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2071 }
70715b9e2109 - Implemented parseAttributeStatement().
aziz
parents: 200
diff changeset
2072
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2073 Statement parseIfStatement()
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2074 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2075 assert(token.type == T.If);
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2076 nT();
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2077
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2078 Statement variable;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2079 Expression condition;
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2080 Statement ifBody, elseBody;
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2081
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2082 require(T.LParen);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2083
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2084 Token* ident;
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2085 auto begin = token; // For start of AutoDeclaration or normal Declaration.
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2086 // auto Identifier = Expression
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2087 if (token.type == T.Auto)
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2088 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2089 nT();
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2090 ident = requireId();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2091 require(T.Assign);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2092 auto init = parseExpression();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2093 auto v = new VariableDeclaration(null, [ident], [init]);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2094 set(v, ident);
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2095 auto d = new StorageClassDeclaration(StorageClass.Auto, T.Auto, v);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2096 set(d, begin);
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
2097 variable = new DeclarationStatement(d);
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2098 set(variable, begin);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2099 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2100 else
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2101 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2102 // Declarator = Expression
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2103 Type parseDeclaratorAssign()
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2104 {
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2105 auto type = parseDeclarator(ident);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2106 require(T.Assign);
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2107 return type;
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2108 }
237
805796880adb - Fix in parseIfStatement(): require(T.Assign) must be encompassed by a try_() call.
aziz
parents: 236
diff changeset
2109 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
2110 auto type = try_(&parseDeclaratorAssign, success);
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2111 if (success)
163
f27a98bb17c7 - Fix: when parsing Declarator fails, type and ident is set to null.
aziz
parents: 162
diff changeset
2112 {
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2113 auto init = parseExpression();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2114 auto v = new VariableDeclaration(type, [ident], [init]);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2115 set(v, begin);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2116 variable = new DeclarationStatement(v);
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
2117 set(variable, begin);
163
f27a98bb17c7 - Fix: when parsing Declarator fails, type and ident is set to null.
aziz
parents: 162
diff changeset
2118 }
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2119 else
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2120 condition = parseExpression();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2121 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2122 require(T.RParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2123 ifBody = parseScopeStatement();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2124 if (token.type == T.Else)
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2125 {
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2126 nT();
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2127 elseBody = parseScopeStatement();
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2128 }
283
df657dd98ffa - Fix: added member type to VariableDeclaration.
aziz
parents: 282
diff changeset
2129 return new IfStatement(variable, condition, ifBody, elseBody);
162
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2130 }
c7b250662c74 - Added class ScopeStatement.
aziz
parents: 161
diff changeset
2131
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2132 Statement parseWhileStatement()
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2133 {
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2134 assert(token.type == T.While);
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2135 nT();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2136 require(T.LParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2137 auto condition = parseExpression();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2138 require(T.RParen);
164
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2139 return new WhileStatement(condition, parseScopeStatement());
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2140 }
8ec99326752b - Implemented parseWhileStatement().
aziz
parents: 163
diff changeset
2141
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2142 Statement parseDoWhileStatement()
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2143 {
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2144 assert(token.type == T.Do);
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2145 nT();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2146 auto doBody = parseScopeStatement();
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2147 require(T.While);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2148 require(T.LParen);
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2149 auto condition = parseExpression();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2150 require(T.RParen);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2151 return new DoWhileStatement(condition, doBody);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2152 }
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2153
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2154 Statement parseForStatement()
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2155 {
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2156 assert(token.type == T.For);
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2157 nT();
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2158 require(T.LParen);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2159
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2160 Statement init, forBody;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2161 Expression condition, increment;
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2162
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2163 if (token.type != T.Semicolon)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2164 init = parseNoScopeStatement();
230
8f1790d16753 - Fix: added missing call to parseDeclaratorSuffx() in parseDeclaration.
aziz
parents: 229
diff changeset
2165 else
8f1790d16753 - Fix: added missing call to parseDeclaratorSuffx() in parseDeclaration.
aziz
parents: 229
diff changeset
2166 nT(); // Skip ;
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2167 if (token.type != T.Semicolon)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2168 condition = parseExpression();
168
fbbb2434bf6b - Simplified parseForStatement().
aziz
parents: 167
diff changeset
2169 require(T.Semicolon);
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2170 if (token.type != T.RParen)
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2171 increment = parseExpression();
168
fbbb2434bf6b - Simplified parseForStatement().
aziz
parents: 167
diff changeset
2172 require(T.RParen);
167
141b908e32b6 - Fix: forgot parsing forBody.
aziz
parents: 166
diff changeset
2173 forBody = parseScopeStatement();
166
56334292a29e - Implemented parseForStatement().
aziz
parents: 165
diff changeset
2174 return new ForStatement(init, condition, increment, forBody);
165
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2175 }
797074d143d7 - Implemented parseDoWhileStatement().
aziz
parents: 164
diff changeset
2176
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2177 Statement parseForeachStatement()
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2178 {
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2179 assert(token.type == T.Foreach || token.type == T.Foreach_reverse);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2180 TOK tok = token.type;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2181 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2182
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
2183 auto params = new Parameters;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2184 Expression e; // Aggregate or LwrExpression
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2185
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2186 require(T.LParen);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2187 while (1)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2188 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2189 auto paramBegin = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2190 Token* stcTok;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2191 Type type;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2192 Token* ident;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2193
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2194 switch (token.type)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2195 {
236
e961d1b957c3 - Fix in parseForeachStatement(): added T.Inout to case T.Ref; removed break statement.
aziz
parents: 235
diff changeset
2196 case T.Ref, T.Inout:
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2197 stcTok = token;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2198 nT();
236
e961d1b957c3 - Fix in parseForeachStatement(): added T.Inout to case T.Ref; removed break statement.
aziz
parents: 235
diff changeset
2199 // fall through
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2200 case T.Identifier:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2201 auto next = peekNext();
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
2202 if (next == T.Comma || next == T.Semicolon || next == T.RParen)
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2203 {
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2204 ident = token;
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2205 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2206 break;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2207 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2208 // fall through
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2209 default:
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2210 type = parseDeclarator(ident);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2211 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2212
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2213 params ~= set(new Parameter(stcTok, type, ident, null), paramBegin);
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2214
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2215 if (token.type != T.Comma)
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2216 break;
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2217 nT();
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2218 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2219 require(T.Semicolon);
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2220 e = parseExpression();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2221 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2222 { //Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2223 if (token.type == T.Slice)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2224 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2225 // if (params.length != 1)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2226 // error(MID.XYZ); // TODO: issue error msg
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2227 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2228 auto upper = parseExpression();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2229 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2230 auto forBody = parseScopeStatement();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2231 return new ForeachRangeStatement(tok, params, e, upper, forBody);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2232 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2233 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2234 // Foreach (ForeachTypeList; Aggregate) ScopeStatement
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2235 require(T.RParen);
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2236 auto forBody = parseScopeStatement();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
2237 return new ForeachStatement(tok, params, e, forBody);
169
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2238 }
4666a05dfacf - Implemented parseForeachStatement().
aziz
parents: 168
diff changeset
2239
170
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2240 Statement parseSwitchStatement()
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2241 {
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2242 assert(token.type == T.Switch);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2243 nT();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2244
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2245 require(T.LParen);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2246 auto condition = parseExpression();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2247 require(T.RParen);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2248 auto switchBody = parseScopeStatement();
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2249 return new SwitchStatement(condition, switchBody);
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2250 }
a63696d1c474 - Implemented parseSwitchStatement().
aziz
parents: 169
diff changeset
2251
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2252 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2253 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
2254 a default or case statement.
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2255 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2256 Statement parseCaseOrDefaultBody()
220
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2257 {
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2258 // 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
2259 auto begin = token;
224
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2260 auto s = new Statements();
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2261 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
2262 token.type != T.Default &&
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2263 token.type != T.RBrace &&
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2264 token.type != T.EOF)
224
f838a37a25bd - Fixed parseCaseDefaultBody().
aziz
parents: 223
diff changeset
2265 s ~= parseStatement();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2266 return set(new ScopeStatement(s), begin);
220
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2267 }
0c647e319b8e - Removed assert from parseStatement().
aziz
parents: 219
diff changeset
2268
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2269 Statement parseCaseStatement()
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2270 {
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2271 assert(token.type == T.Case);
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
2272 nT();
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
2273 auto values = parseExpressionList();
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2274 require(T.Colon);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2275 auto caseBody = parseCaseOrDefaultBody();
171
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2276 return new CaseStatement(values, caseBody);
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2277 }
f1fa9bbdb4cb - Implemented parseCaseStatement().
aziz
parents: 170
diff changeset
2278
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2279 Statement parseDefaultStatement()
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2280 {
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2281 assert(token.type == T.Default);
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2282 nT();
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2283 require(T.Colon);
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2284 auto defaultBody = parseCaseOrDefaultBody();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2285 return new DefaultStatement(defaultBody);
172
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2286 }
89d4519bd8a1 - Implemented parseDefaultStatement().
aziz
parents: 171
diff changeset
2287
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2288 Statement parseContinueStatement()
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2289 {
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2290 assert(token.type == T.Continue);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2291 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2292 Token* ident;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2293 if (token.type == T.Identifier)
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2294 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2295 ident = token;
173
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2296 nT();
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2297 }
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2298 require(T.Semicolon);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2299 return new ContinueStatement(ident);
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2300 }
c2714ba44350 - Implemented parseContinueStatement().
aziz
parents: 172
diff changeset
2301
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2302 Statement parseBreakStatement()
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2303 {
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2304 assert(token.type == T.Break);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2305 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2306 Token* ident;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2307 if (token.type == T.Identifier)
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2308 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2309 ident = token;
174
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2310 nT();
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2311 }
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2312 require(T.Semicolon);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2313 return new BreakStatement(ident);
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2314 }
e51c9ee66ea0 - Implemented parseBreakStatement().
aziz
parents: 173
diff changeset
2315
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2316 Statement parseReturnStatement()
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2317 {
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2318 assert(token.type == T.Return);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2319 nT();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2320 Expression expr;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2321 if (token.type != T.Semicolon)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
2322 expr = parseExpression();
175
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2323 require(T.Semicolon);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2324 return new ReturnStatement(expr);
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2325 }
522df6f0f230 - Implemented parseReturnStatement().
aziz
parents: 174
diff changeset
2326
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2327 Statement parseGotoStatement()
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2328 {
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2329 assert(token.type == T.Goto);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2330 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2331 Token* ident;
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2332 Expression caseExpr;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2333 switch (token.type)
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2334 {
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2335 case T.Case:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2336 nT();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2337 if (token.type == T.Semicolon)
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2338 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2339 caseExpr = parseExpression();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2340 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2341 case T.Default:
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2342 nT();
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2343 break;
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2344 default:
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2345 ident = requireId();
176
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2346 }
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2347 require(T.Semicolon);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2348 return new GotoStatement(ident, caseExpr);
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2349 }
3071522c0cf0 - Implemented parseGotoStatement().
aziz
parents: 175
diff changeset
2350
177
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2351 Statement parseWithStatement()
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2352 {
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2353 assert(token.type == T.With);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2354 nT();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2355 require(T.LParen);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2356 auto expr = parseExpression();
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2357 require(T.RParen);
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2358 return new WithStatement(expr, parseScopeStatement());
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2359 }
504b1b2f7c93 - Implemented parseWithStatement().
aziz
parents: 176
diff changeset
2360
178
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2361 Statement parseSynchronizedStatement()
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2362 {
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2363 assert(token.type == T.Synchronized);
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2364 nT();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2365 Expression expr;
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2366
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2367 if (token.type == T.LParen)
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2368 {
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2369 nT();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2370 expr = parseExpression();
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2371 require(T.RParen);
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2372 }
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2373 return new SynchronizedStatement(expr, parseScopeStatement());
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2374 }
62718b29679e - Implemented parseSynchronizedStatement().
aziz
parents: 177
diff changeset
2375
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2376 Statement parseTryStatement()
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2377 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2378 assert(token.type == T.Try);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2379 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2380
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2381 auto tryBody = parseScopeStatement();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2382 CatchBody[] catchBodies;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2383 FinallyBody finBody;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2384
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2385 while (token.type == T.Catch)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2386 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2387 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2388 Parameter param;
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2389 if (token.type == T.LParen)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2390 {
229
a88967db063b - Fix: skip T.LParen in parseTryStatement().
aziz
parents: 228
diff changeset
2391 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2392 auto begin = token;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
2393 Token* ident;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
2394 auto type = parseDeclarator(ident, true);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
2395 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
2396 set(param, begin);
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2397 require(T.RParen);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2398 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2399 catchBodies ~= new CatchBody(param, parseNoScopeStatement());
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2400 if (param is null)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2401 break; // This is a LastCatch
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2402 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2403
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2404 if (token.type == T.Finally)
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2405 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2406 auto begin = token;
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2407 nT();
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2408 finBody = new FinallyBody(parseNoScopeStatement());
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2409 set(finBody, begin);
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2410 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2411
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
2412 if (catchBodies.length == 0 && finBody is null)
179
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2413 {
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2414 // TODO: issue error msg.
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2415 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2416
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2417 return new TryStatement(tryBody, catchBodies, finBody);
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2418 }
507998c5c1ce - Implemented parseTryStatement().
aziz
parents: 178
diff changeset
2419
180
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2420 Statement parseThrowStatement()
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2421 {
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2422 assert(token.type == T.Throw);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2423 nT();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2424 auto expr = parseExpression();
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2425 require(T.Semicolon);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2426 return new ThrowStatement(expr);
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2427 }
d5a67aa578a8 - Implemented parseThrowStatement().
aziz
parents: 179
diff changeset
2428
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2429 Statement parseScopeGuardStatement()
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2430 {
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2431 assert(token.type == T.Scope);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2432 nT();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2433 assert(token.type == T.LParen);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2434 nT();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2435
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2436 Token* condition = requireId();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2437 if (condition)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2438 switch (condition.identifier)
181
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2439 {
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2440 case "exit":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2441 case "success":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2442 case "failure":
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2443 break;
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2444 default:
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2445 // TODO: issue error msg.
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2446 }
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2447 require(T.RParen);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2448 Statement scopeBody;
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2449 if (token.type == T.LBrace)
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2450 scopeBody = parseScopeStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2451 else
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2452 scopeBody = parseNoScopeStatement();
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2453 return new ScopeGuardStatement(condition, scopeBody);
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2454 }
abfd51142477 - Implemented parseScopeGuardStatement().
aziz
parents: 180
diff changeset
2455
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2456 Statement parseVolatileStatement()
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2457 {
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2458 assert(token.type == T.Volatile);
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2459 nT();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2460 Statement volatileBody;
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2461 if (token.type == T.Semicolon)
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2462 nT();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2463 else if (token.type == T.LBrace)
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2464 volatileBody = parseScopeStatement();
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2465 else
219
0d14a09227a4 - Simplified parseScopeStatement().
aziz
parents: 218
diff changeset
2466 volatileBody = parseStatement();
182
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2467 return new VolatileStatement(volatileBody);
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2468 }
673b355ba0e9 - Implemented parseVolatileStatement().
aziz
parents: 181
diff changeset
2469
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2470 Statement parsePragmaStatement()
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2471 {
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2472 assert(token.type == T.Pragma);
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2473 nT();
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2474
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
2475 Token* ident;
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2476 Expression[] args;
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2477 Statement pragmaBody;
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2478
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2479 require(T.LParen);
245
93d37f874658 - Changed type of pragma identifier to Token*.
aziz
parents: 244
diff changeset
2480 ident = requireId();
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2481
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2482 if (token.type == T.Comma)
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2483 {
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2484 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2485 args = parseExpressionList();
244
829fdb2e2915 - Fix: parsing at least one argument in pragma declarations/statements.
aziz
parents: 243
diff changeset
2486 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
2487 require(T.RParen);
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2488
234
5c1111dc8670 - Added method parseNoScopeOrEmptyStatement().
aziz
parents: 233
diff changeset
2489 pragmaBody = parseNoScopeOrEmptyStatement();
184
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2490
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2491 return new PragmaStatement(ident, args, pragmaBody);
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2492 }
30a4c8522b09 - Implemented parsePragmaStatement().
aziz
parents: 183
diff changeset
2493
186
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2494 Statement parseStaticIfStatement()
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2495 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2496 assert(token.type == T.Static);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2497 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2498 assert(token.type == T.If);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2499 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2500 Expression condition;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2501 Statement ifBody, elseBody;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2502
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2503 require(T.LParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2504 condition = parseExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2505 require(T.RParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2506 ifBody = parseNoScopeStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2507 if (token.type == T.Else)
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2508 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2509 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2510 elseBody = parseNoScopeStatement();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2511 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2512 return new StaticIfStatement(condition, ifBody, elseBody);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2513 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2514
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2515 Statement parseStaticAssertStatement()
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2516 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2517 assert(token.type == T.Static);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2518 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2519 assert(token.type == T.Assert);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2520 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2521 Expression condition, message;
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2522 require(T.LParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2523 condition = parseAssignExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2524 if (token.type == T.Comma)
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2525 {
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2526 nT();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2527 message = parseAssignExpression();
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2528 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2529 require(T.RParen);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2530 require(T.Semicolon);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2531 return new StaticAssertStatement(condition, message);
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2532 }
d4292a5a7b8b - Implemented parseStaticIfStatement() and parseStaticAssertStatement().
aziz
parents: 185
diff changeset
2533
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2534 Statement parseDebugStatement()
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2535 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2536 assert(token.type == T.Debug);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2537 nT(); // Skip debug keyword.
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2538
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2539 Token* cond; // debug ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2540 // debug ( Identifier )
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2541 Statement debugBody, elseBody;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2542
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2543 void parseIdentOrInt(ref Token* tok)
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2544 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2545 nT();
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2546 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2547 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2548 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2549 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2550 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2551 }
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2552 else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2553 expected(T.Identifier); // TODO: better error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2554 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2555
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2556 // if (token.type == T.Assign)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2557 // {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2558 // parseIdentOrInt(identSpec, levelSpec);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2559 // require(T.Semicolon);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2560 // }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2561 // else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2562 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2563 // Condition:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2564 // Integer
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2565 // Identifier
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2566
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2567 // ( Condition )
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2568 if (token.type == T.LParen)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2569 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2570 parseIdentOrInt(cond);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2571 require(T.RParen);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2572 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2573
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2574 // debug Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2575 // debug ( Condition ) Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2576 debugBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2577
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2578 // else Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2579 if (token.type == T.Else)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2580 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2581 // debug without condition and else body makes no sense
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2582 //if (levelCond == -1 && identCond.length == 0)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2583 // TODO: issue error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2584 nT();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2585 elseBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2586 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2587 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2588
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2589 return new DebugStatement(cond, debugBody, elseBody);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2590 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2591
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2592 Statement parseVersionStatement()
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2593 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2594 assert(token.type == T.Version);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2595
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2596 nT(); // Skip version keyword.
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2597
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2598 Token* cond; // version ( Integer )
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2599 // version ( Identifier )
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2600 Statement versionBody, elseBody;
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2601
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2602 void parseIdentOrInt(ref Token* tok)
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2603 {
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2604 if (token.type == T.Int32 ||
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2605 token.type == T.Identifier)
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2606 {
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2607 tok = token;
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2608 nT();
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2609 }
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2610 else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2611 expected(T.Identifier); // TODO: better error msg
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2612 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2613
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2614 // if (token.type == T.Assign)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2615 // {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2616 // parseIdentOrInt(identSpec, levelSpec);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2617 // require(T.Semicolon);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2618 // }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2619 // else
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2620 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2621 // Condition:
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2622 // Integer
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2623 // Identifier
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2624
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2625 // ( Condition )
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2626 require(T.LParen);
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2627 parseIdentOrInt(cond);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2628 require(T.RParen);
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2629
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2630 // version ( Condition ) Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2631 versionBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2632
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2633 // else Statement
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2634 if (token.type == T.Else)
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2635 {
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2636 nT();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2637 elseBody = parseNoScopeStatement();
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2638 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2639 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2640
264
50cc74026ea8 - Changed some string types to Token*.
aziz
parents: 263
diff changeset
2641 return new VersionStatement(cond, versionBody, elseBody);
190
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2642 }
d0712601fa47 - Implemented parseDebugStatement() and parseVersionStatement().
aziz
parents: 188
diff changeset
2643
161
82c5cfc7d6d3 - Started implementation of parsing statements.
aziz
parents: 160
diff changeset
2644 /+++++++++++++++++++++++++++++
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2645 + Assembler parsing methods +
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2646 +++++++++++++++++++++++++++++/
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2647
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2648 Statement parseAsmStatement()
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2649 {
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2650 assert(token.type == T.Asm);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2651 nT(); // Skip asm keyword.
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2652 require(T.LBrace);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2653 auto ss = new Statements;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2654 while (token.type != T.RBrace && token.type != T.EOF)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2655 ss ~= parseAsmInstruction();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2656 require(T.RBrace);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2657 return new AsmStatement(ss);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2658 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2659
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2660 Statement parseAsmInstruction()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2661 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2662 auto begin = token;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2663 Statement s;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2664 typeof(token) ident;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2665 switch (token.type)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2666 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2667 // Keywords that are valid opcodes.
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2668 case T.In, T.Int, T.Out:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2669 ident = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2670 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2671 goto LOpcode;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2672 case T.Identifier:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2673 ident = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2674 nT(); // Skip Identifier
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2675 if (token.type == T.Colon)
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2676 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2677 // Identifier : AsmInstruction
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2678 nT(); // Skip :
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2679 s = new LabeledStatement(ident, parseAsmInstruction());
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2680 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2681 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2682
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2683 LOpcode:
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2684 // Opcode ;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2685 // Opcode Operands ;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2686 // Opcode
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2687 // Identifier
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2688 Expression[] es;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2689 if (token.type != T.Semicolon)
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2690 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2691 while (1)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2692 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2693 es ~= parseAsmExpression();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2694 if (token.type != T.Comma)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2695 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2696 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2697 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2698 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2699 require(T.Semicolon);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2700 s = new AsmInstruction(ident, es);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2701 break;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2702 case T.Align:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2703 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2704 auto number = token;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2705 switch (token.type)
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2706 {
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2707 case T.Int32, T.Int64, T.Uint32, T.Uint64:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2708 number = token; nT(); break;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2709 default:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2710 if (token.type != T.Semicolon)
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2711 nT();
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2712 number = null;
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2713 // TODO: report error: number expected after asm align statement.
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2714 error(MID.ExpectedButFound, "integer", token.srcText);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2715 }
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2716 require(T.Semicolon);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2717 s = new AsmAlignStatement(number);
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2718 break;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2719 case T.Semicolon:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2720 s = new EmptyStatement();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2721 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2722 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2723 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2724 error(MID.ExpectedButFound, "AsmInstruction", token.srcText);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2725 s = new IllegalAsmInstruction(token);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2726 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2727 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2728 set(s, begin);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2729 return s;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2730 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2731
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2732 Expression parseAsmExpression()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2733 {
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2734 auto begin = token;
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2735 auto e = parseAsmOrOrExpression();
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2736 if (token.type == T.Question)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2737 {
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
2738 auto tok = token;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2739 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2740 auto iftrue = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2741 require(T.Colon);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2742 auto iffalse = parseAsmExpression();
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
2743 e = new CondExpression(e, iftrue, iffalse, tok);
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2744 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2745 }
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
2746 // TODO: create AsmExpression that contains e?
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2747 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2748 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2749
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2750 Expression parseAsmOrOrExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2751 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2752 alias parseAsmAndAndExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2753 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2754 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2755 while (token.type == T.OrLogical)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2756 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2757 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2758 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2759 e = new OrOrExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2760 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2761 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2762 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2763 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2764
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2765 Expression parseAsmAndAndExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2766 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2767 alias parseAsmOrExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2768 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2769 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2770 while (token.type == T.AndLogical)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2771 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2772 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2773 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2774 e = new AndAndExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2775 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2776 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2777 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2778 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2779
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2780 Expression parseAsmOrExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2781 {
375
0bd21b746a04 - Added code to main() for recognizing options to the importgraph command.
aziz
parents: 374
diff changeset
2782 alias parseAsmXorExpression parseNext;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2783 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2784 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2785 while (token.type == T.OrBinary)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2786 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2787 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2788 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2789 e = new OrExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2790 set(e, begin);
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 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2793 }
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 Expression parseAsmXorExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2796 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2797 alias parseAsmAndExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2798 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2799 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2800 while (token.type == T.Xor)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2801 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2802 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2803 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2804 e = new XorExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2805 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2806 }
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
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2810 Expression parseAsmAndExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2811 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2812 alias parseAsmCmpExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2813 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2814 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2815 while (token.type == T.AndBinary)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2816 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2817 auto tok = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2818 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2819 e = new AndExpression(e, parseNext(), tok);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2820 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2821 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2822 return e;
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
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2825 Expression parseAsmCmpExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2826 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2827 alias parseAsmShiftExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2828 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2829 auto e = parseNext();
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 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2832 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2833 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2834 case T.Equal, T.NotEqual:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2835 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2836 e = new EqualExpression(e, parseNext(), operator);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2837 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2838 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2839 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2840 e = new RelExpression(e, parseNext(), operator);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2841 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2842 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2843 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2844 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2845 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2846 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2847 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2848
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2849 Expression parseAsmShiftExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2850 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2851 alias parseAsmAddExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2852 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2853 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2854 while (1)
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 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2857 switch (operator.type)
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 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
2860 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
2861 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
2862 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2863 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2864 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2865 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2866 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2867 assert(0);
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
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2870 Expression parseAsmAddExpression()
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 alias parseAsmMulExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2873 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2874 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2875 while (1)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2876 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2877 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2878 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2879 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2880 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
2881 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
2882 // Not allowed in asm
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2883 //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
2884 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2885 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2886 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2887 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2888 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2889 assert(0);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2890 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2891
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2892 Expression parseAsmMulExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2893 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2894 alias parseAsmPostExpression parseNext;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2895 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2896 auto e = parseNext();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2897 while (1)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2898 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2899 auto operator = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2900 switch (operator.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2901 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2902 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
2903 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
2904 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
2905 default:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2906 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2907 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2908 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2909 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2910 assert(0);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2911 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2912
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2913 Expression parseAsmPostExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2914 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2915 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2916 auto e = parseAsmUnaryExpression();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2917 while (token.type == T.LBracket)
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2918 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2919 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2920 e = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2921 e = new AsmPostBracketExpression(e);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2922 require(T.RBracket);
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 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2925 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2926 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2927
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2928 Expression parseAsmUnaryExpression()
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2929 {
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2930 auto begin = token;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2931 Expression e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2932 switch (token.type)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2933 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2934 case T.Byte, T.Short, T.Int,
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2935 T.Float, T.Double, T.Real:
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2936 goto LAsmTypePrefix;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2937 case T.Identifier:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2938 switch (token.identifier)
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2939 {
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2940 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
2941 "word", "dword", "qword"/*, "float", "double", "real"*/:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2942 LAsmTypePrefix:
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2943 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2944 if (token.type == T.Identifier && token.identifier == "ptr")
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2945 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2946 else
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2947 error(MID.ExpectedButFound, "ptr", token.srcText);
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2948 e = new AsmTypeExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2949 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2950 case "offset":
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2951 nT();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2952 e = new AsmOffsetExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2953 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2954 case "seg":
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2955 nT();
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2956 e = new AsmSegExpression(parseAsmExpression());
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2957 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2958 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2959 goto LparseAsmPrimaryExpression;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2960 }
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2961 break;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2962 case T.Minus:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2963 case T.Plus:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2964 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2965 e = new SignExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2966 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2967 case T.Not:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2968 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2969 e = new NotExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2970 break;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2971 case T.Tilde:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2972 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2973 e = new CompExpression(parseAsmUnaryExpression());
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2974 default:
374
6d22f0b6a674 - Added class AsmAlignStatement.
aziz
parents: 369
diff changeset
2975 LparseAsmPrimaryExpression:
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2976 e = parseAsmPrimaryExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2977 return e;
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2978 }
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2979 set(e, begin);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
2980 return e;
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2981 }
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
2982
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2983 Expression parseAsmPrimaryExpression()
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2984 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2985 auto begin = token;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2986 Expression e;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2987 switch (token.type)
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2988 {
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2989 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
2990 e = new IntExpression(token.type, token.ulong_);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2991 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2992 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2993 case T.Float32, T.Float64, T.Float80,
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2994 T.Imaginary32, T.Imaginary64, T.Imaginary80:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
2995 e = new RealExpression(token.type, token.real_);
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2996 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2997 break;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2998 case T.Dollar:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
2999 e = new DollarExpression();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3000 nT();
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3001 break;
287
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3002 case T.LBracket:
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3003 // [ AsmExpression ]
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3004 nT();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3005 e = parseAsmExpression();
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3006 require(T.RBracket);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3007 e = new AsmBracketExpression(e);
211bdd69397d - Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
aziz
parents: 285
diff changeset
3008 break;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3009 case T.Identifier:
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3010 switch (token.identifier)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3011 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3012 // __LOCAL_SIZE
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3013 case "__LOCAL_SIZE":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3014 e = new AsmLocalSizeExpression();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3015 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3016 break;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3017 // Register
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3018 case "ST":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3019 auto register = token;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3020 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3021 // (1) - (7)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3022 Token* number;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3023 if (token.type == T.LParen)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3024 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3025 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3026 if (token.type == T.Int32)
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3027 {
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3028 number = token;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3029 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3030 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3031 else
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3032 expected(T.Int32);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3033 require(T.RParen);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3034 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3035 e = new AsmRegisterExpression(register, number);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3036 break;
417
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3037 case "FS":
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3038 auto register = token;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3039 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3040 // TODO: is the colon-number part optional?
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3041 Token* number;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3042 if (token.type == T.Colon)
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3043 {
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3044 // :0, :4, :8
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3045 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3046 switch (token.srcText)
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3047 {
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3048 case "0", "4", "8":
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3049 number = token;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3050 nT();
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3051 break;
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3052 default:
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3053 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
3054 }
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3055 }
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3056 e = new AsmRegisterExpression(register, number);
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3057 break;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3058 case "AL", "AH", "AX", "EAX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3059 "BL", "BH", "BX", "EBX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3060 "CL", "CH", "CX", "ECX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3061 "DL", "DH", "DX", "EDX",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3062 "BP", "EBP",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3063 "SP", "ESP",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3064 "DI", "EDI",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3065 "SI", "ESI",
417
8af5c7e2f722 Fixed parsing asm FS register.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 415
diff changeset
3066 "ES", "CS", "SS", "DS", "GS",
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3067 "CR0", "CR2", "CR3", "CR4",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3068 "DR0", "DR1", "DR2", "DR3", "DR6", "DR7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3069 "TR3", "TR4", "TR5", "TR6", "TR7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3070 "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7",
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3071 "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7":
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3072 e = new AsmRegisterExpression(token);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3073 nT();
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3074 break;
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3075 default:
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3076 // DotIdentifier
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3077 Expression[] identList;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3078 while (1)
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3079 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3080 auto begin2 = token;
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3081 auto ident = requireId();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3082 e = new IdentifierExpression(ident);
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3083 set(e, begin2);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3084 identList ~= e;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3085 if (token.type != T.Dot)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3086 break;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3087 nT(); // Skip dot.
288
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3088 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3089 e = new DotListExpression(identList);
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3090 }
833b301497f4 - Added classes AsmLocalSizeExpression and AsmRegisterExpression.
aziz
parents: 287
diff changeset
3091 break;
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3092 default:
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3093 error(MID.ExpectedButFound, "Expression", token.srcText);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3094 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
3095 if (!trying)
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3096 {
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3097 // 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
3098 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
3099 prevToken = begin;
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3100 }
285
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3101 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3102 set(e, begin);
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3103 return e;
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3104 }
104343e0f097 - Started implementation of asm statements parser.
aziz
parents: 284
diff changeset
3105
183
c9df82f6f6be - Added parseAsmStatement() stub.
aziz
parents: 182
diff changeset
3106 /+++++++++++++++++++++++++++++
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3107 + Expression parsing methods +
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3108 +++++++++++++++++++++++++++++/
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3109
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3110 Expression parseExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3111 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3112 auto begin = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3113 auto e = parseAssignExpression();
122
9849a263f148 - Added method parseDeclarationsBlock().
aziz
parents: 121
diff changeset
3114 while (token.type == T.Comma)
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3115 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3116 auto comma = token;
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3117 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3118 e = new CommaExpression(e, parseAssignExpression(), comma);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3119 set(e, begin);
235
3384ac8878f7 - Fixed parseExpression(). Forgot to skip T.Comma.
aziz
parents: 234
diff changeset
3120 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3121 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3122 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3123
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3124 Expression parseAssignExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3125 {
319
83f1f9a4f248 - Removed assigment to 'begin' from loop. Initializing 'begin' at decl point.
aziz
parents: 318
diff changeset
3126 auto begin = token;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3127 auto e = parseCondExpression();
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3128 while (1)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3129 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3130 switch (token.type)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3131 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3132 case T.Assign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3133 nT(); e = new AssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3134 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3135 case T.LShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3136 nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3137 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3138 case T.RShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3139 nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3140 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3141 case T.URShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3142 nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3143 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3144 case T.OrAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3145 nT(); e = new OrAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3146 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3147 case T.AndAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3148 nT(); e = new AndAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3149 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3150 case T.PlusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3151 nT(); e = new PlusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3152 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3153 case T.MinusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3154 nT(); e = new MinusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3155 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3156 case T.DivAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3157 nT(); e = new DivAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3158 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3159 case T.MulAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3160 nT(); e = new MulAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3161 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3162 case T.ModAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3163 nT(); e = new ModAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3164 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3165 case T.XorAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3166 nT(); e = new XorAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3167 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3168 case T.CatAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3169 nT(); e = new CatAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3170 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3171 default:
218
6c0d274e0f3f - Removed goto from parseAssignExpression().
aziz
parents: 217
diff changeset
3172 return e;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3173 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3174 set(e, begin);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3175 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3176 return e;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3177 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3178
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3179 Expression parseCondExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3180 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3181 auto begin = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3182 auto e = parseOrOrExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3183 if (token.type == T.Question)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3184 {
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
3185 auto tok = token;
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3186 nT();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3187 auto iftrue = parseExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3188 require(T.Colon);
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3189 auto iffalse = parseCondExpression();
293
418c6548ce17 - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 292
diff changeset
3190 e = new CondExpression(e, iftrue, iffalse, tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3191 set(e, begin);
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3192 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3193 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3194 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3195
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3196 Expression parseOrOrExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
3197 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3198 alias parseAndAndExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3199 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3200 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3201 while (token.type == T.OrLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3202 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3203 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3204 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3205 e = new OrOrExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3206 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3207 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3208 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3209 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3210
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3211 Expression parseAndAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3212 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3213 alias parseOrExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3214 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3215 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3216 while (token.type == T.AndLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3217 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3218 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3219 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3220 e = new AndAndExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3221 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3222 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3223 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3224 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3225
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3226 Expression parseOrExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3227 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3228 alias parseXorExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3229 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3230 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3231 while (token.type == T.OrBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3232 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3233 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3234 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3235 e = new OrExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3236 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3237 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3238 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3239 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3240
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3241 Expression parseXorExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3242 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3243 alias parseAndExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3244 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3245 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3246 while (token.type == T.Xor)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3247 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3248 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3249 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3250 e = new XorExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3251 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3252 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3253 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3254 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3255
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3256 Expression parseAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3257 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3258 alias parseCmpExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3259 auto begin = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3260 auto e = parseNext();
223
043722eed46e - Fix: if-statements should be while-statements.
aziz
parents: 222
diff changeset
3261 while (token.type == T.AndBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3262 {
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3263 auto tok = token;
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3264 nT();
251
67a798459532 - Added parameter Token* tok to some Expression constructors. Adapted parser accordingly.
aziz
parents: 250
diff changeset
3265 e = new AndExpression(e, parseNext(), tok);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3266 set(e, begin);
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3267 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3268 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3269 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3270
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3271 Expression parseCmpExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
3272 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3273 alias parseShiftExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3274 auto begin = token;
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3275 auto e = parseShiftExpression();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3276
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3277 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3278 switch (operator.type)
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3279 {
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3280 case T.Equal, T.NotEqual:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3281 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3282 e = new EqualExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3283 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3284 case T.Not:
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
3285 if (peekNext() != T.Is)
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3286 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3287 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3288 // fall through
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3289 case T.Is:
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3290 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3291 e = new IdentityExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3292 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3293 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3294 T.Unordered, T.UorE, T.UorG, T.UorGorE,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3295 T.UorL, T.UorLorE, T.LorEorG, T.LorG:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3296 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3297 e = new RelExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3298 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3299 case T.In:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3300 nT();
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3301 e = new InExpression(e, parseNext(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3302 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3303 default:
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3304 return e;
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3305 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3306 set(e, begin);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3307 return e;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3308 }
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3309
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3310 Expression parseShiftExpression()
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
3311 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3312 alias parseAddExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3313 auto begin = token;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3314 auto e = parseNext();
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3315 while (1)
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3316 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3317 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3318 switch (operator.type)
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3319 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3320 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
3321 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
3322 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
3323 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3324 return e;
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3325 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3326 set(e, begin);
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3327 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3328 assert(0);
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3329 }
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3330
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3331 Expression parseAddExpression()
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
3332 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3333 alias parseMulExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3334 auto begin = token;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3335 auto e = parseNext();
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3336 while (1)
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3337 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3338 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3339 switch (operator.type)
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3340 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3341 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
3342 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
3343 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
3344 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3345 return e;
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3346 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3347 set(e, begin);
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3348 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3349 assert(0);
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3350 }
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3351
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3352 Expression parseMulExpression()
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
3353 {
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3354 alias parsePostExpression parseNext;
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3355 auto begin = token;
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3356 auto e = parseNext();
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3357 while (1)
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3358 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3359 auto operator = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3360 switch (operator.type)
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3361 {
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3362 case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3363 case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3364 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
3365 default:
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3366 return e;
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3367 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3368 set(e, begin);
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3369 }
228
a4c5ee9527b7 - Replaced assert(0); with break; in case T.Static. Renamed local t to next.
aziz
parents: 227
diff changeset
3370 assert(0);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3371 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
3372
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3373 Expression parsePostExpression()
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3374 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3375 auto begin = token;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3376 auto e = parseUnaryExpression();
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3377 while (1)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3378 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3379 switch (token.type)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3380 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3381 case T.Dot:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3382 e = new PostDotListExpression(e, parseDotListExpression());
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3383 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3384 case T.PlusPlus:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3385 e = new PostIncrExpression(e);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3386 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3387 case T.MinusMinus:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3388 e = new PostDecrExpression(e);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3389 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3390 case T.LParen:
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3391 e = new CallExpression(e, parseArguments());
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3392 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3393 case T.LBracket:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3394 // parse Slice- and IndexExpression
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3395 nT();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3396 // [] is a SliceExpression
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3397 if (token.type == T.RBracket)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3398 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3399 e = new SliceExpression(e, null, null);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3400 break;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3401 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3402
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3403 Expression[] es = [parseAssignExpression()];
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3404
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3405 // [ AssignExpression .. AssignExpression ]
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3406 if (token.type == T.Slice)
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3407 {
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3408 nT();
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3409 e = new SliceExpression(e, es[0], parseAssignExpression());
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3410 require(T.RBracket);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3411 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3412 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3413
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3414 // [ ExpressionList ]
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3415 if (token.type == T.Comma)
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3416 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3417 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3418 es ~= parseExpressionList();
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3419 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3420 require(T.RBracket);
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3421
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3422 e = new IndexExpression(e, es);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3423 goto Lset;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3424 default:
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3425 return e;
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3426 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3427 nT();
489
a7291d3ee9d7 Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 488
diff changeset
3428 Lset: // Jumped here to skip nT().
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3429 set(e, begin);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3430 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3431 assert(0);
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3432 }
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3433
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3434 Expression parseUnaryExpression()
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3435 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3436 auto begin = token;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3437 Expression e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3438 switch (token.type)
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3439 {
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3440 case T.AndBinary:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3441 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3442 e = new AddressExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3443 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3444 case T.PlusPlus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3445 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3446 e = new PreIncrExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3447 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3448 case T.MinusMinus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3449 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3450 e = new PreDecrExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3451 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3452 case T.Mul:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3453 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3454 e = new DerefExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3455 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3456 case T.Minus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3457 case T.Plus:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3458 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3459 e = new SignExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3460 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3461 case T.Not:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3462 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3463 e = new NotExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3464 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3465 case T.Tilde:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3466 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3467 e = new CompExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3468 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3469 case T.New:
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3470 e = parseNewExpression();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3471 return e;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3472 case T.Delete:
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3473 nT();
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3474 e = new DeleteExpression(parseUnaryExpression());
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3475 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3476 case T.Cast:
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3477 requireNext(T.LParen);
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3478 Type type;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3479 switch (token.type)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3480 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3481 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3482 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3483 auto begin2 = token;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3484 case T.Const:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3485 type = new ConstType(null);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3486 goto case_break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3487 case T.Invariant:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3488 type = new InvariantType(null);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3489 case_break:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3490 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3491 set(type, begin2);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3492 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3493 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3494 default:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3495 type = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3496 }
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3497 require(T.RParen);
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3498 e = new CastExpression(parseUnaryExpression(), type);
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3499 break;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3500 case T.LParen:
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3501 // ( Type ) . Identifier
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3502 Type parseType_()
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3503 {
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3504 nT();
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3505 auto type = parseType();
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3506 require(T.RParen);
233
c2b601dcd57d - Added assert to parseDotListExpression().
aziz
parents: 232
diff changeset
3507 require(T.Dot);
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3508 return type;
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3509 }
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3510 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
3511 auto type = try_(&parseType_, success);
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3512 if (success)
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3513 {
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3514 auto ident = requireId();
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3515 e = new TypeDotIdExpression(type, ident);
257
6c58366ba1eb - Fix: need to allocate Parameters.
aziz
parents: 256
diff changeset
3516 break;
225
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3517 }
8883c113c2f1 - Fix: case T.Identity should be T.Is.
aziz
parents: 224
diff changeset
3518 goto default;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3519 default:
335
b245b234fdd9 - Moved parsePostExpression() above parseUnaryExpression().
aziz
parents: 327
diff changeset
3520 e = parsePrimaryExpression();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3521 return e;
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3522 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3523 assert(e !is null);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3524 set(e, begin);
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3525 return e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3526 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
3527
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
3528 Expression parsePrimaryExpression()
78
f043759fb59a - Added code to parseUnaryExpression(); not fully implemented.
aziz
parents: 77
diff changeset
3529 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3530 auto begin = token;
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3531 Expression e;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3532 switch (token.type)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3533 {
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3534 case T.Identifier, T.Dot, T.Typeof:
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3535 e = parseDotListExpression();
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3536 break;
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3537 case T.This:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3538 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3539 e = new ThisExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3540 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3541 case T.Super:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3542 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3543 e = new SuperExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3544 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3545 case T.Null:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3546 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3547 e = new NullExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3548 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3549 case T.True, T.False:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3550 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3551 e = new BoolExpression();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3552 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3553 case T.Dollar:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3554 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3555 e = new DollarExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3556 break;
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3557 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
3558 e = new IntExpression(token.type, token.ulong_);
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3559 nT();
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3560 break;
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3561 case T.Float32, T.Float64, T.Float80,
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3562 T.Imaginary32, T.Imaginary64, T.Imaginary80:
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3563 e = new RealExpression(token.type, token.real_);
97
1a83e5070a84 - Added code for parsing IntNumber- and RealNumberExpressions.
aziz
parents: 96
diff changeset
3564 nT();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3565 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3566 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
3567 e = new CharExpression(token);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3568 nT();
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.String:
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3571 Token*[] stringLiterals;
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3572 do
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3573 {
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3574 stringLiterals ~= token;
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3575 nT();
157
fdbd47d72614 - Renamed class StringLiteralExpression to StringLiteralsExpression.
aziz
parents: 156
diff changeset
3576 } while (token.type == T.String)
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3577 e = new StringExpression(stringLiterals);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3578 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3579 case T.LBracket:
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3580 Expression[] values;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3581
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3582 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3583 if (token.type != T.RBracket)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3584 {
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3585 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3586 if (token.type == T.Colon)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3587 goto LparseAssocArray;
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3588 if (token.type == T.Comma)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3589 {
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3590 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3591 values = [e] ~ parseExpressionList();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3592 }
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
3593 require(T.RBracket);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3594 }
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3595 else
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3596 nT();
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3597
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3598 e = new ArrayLiteralExpression(values);
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3599 break;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3600
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3601 LparseAssocArray:
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3602 Expression[] keys;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3603
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3604 keys ~= e;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
3605 nT(); // Skip colon.
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3606 goto LenterLoop;
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3607
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3608 while (1)
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
3609 {
271
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3610 keys ~= parseAssignExpression();
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3611 require(T.Colon);
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3612 LenterLoop:
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3613 values ~= parseAssignExpression();
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3614 if (token.type != T.Comma)
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3615 break;
68987c1c59b6 - Fixed parsing empty ArrayLiteralExpression. Needed to skip T.RBracket.
aziz
parents: 270
diff changeset
3616 nT();
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
3617 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3618 require(T.RBracket);
399
ff1d11c27061 Renamed some Expression classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 398
diff changeset
3619 e = new AArrayLiteralExpression(keys, values);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3620 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3621 case T.LBrace:
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
3622 // DelegateLiteral := { Statements }
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3623 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3624 e = new FunctionLiteralExpression(funcBody);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3625 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3626 case T.Function, T.Delegate:
193
2a2975b6d539 - Using parseFunctionBody() when parsing FunctionLiteralExpression.
aziz
parents: 192
diff changeset
3627 // FunctionLiteral := (function|delegate) Type? '(' ArgumentList ')' '{' Statements '}'
133
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3628 nT(); // Skip function|delegate token.
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3629 Type returnType;
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3630 Parameters parameters;
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3631 if (token.type != T.LBrace)
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3632 {
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3633 if (token.type != T.LParen) // Optional return type
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3634 returnType = parseType();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3635 parameters = parseParameterList();
133
3924b1ee1302 - Added code for parsing function and delegate literal expressions.
aziz
parents: 132
diff changeset
3636 }
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3637 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3638 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
3639 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3640 case T.Assert:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3641 Expression msg;
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3642 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3643 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
3644 if (token.type == T.Comma)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3645 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3646 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3647 msg = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3648 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3649 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3650 e = new AssertExpression(e, msg);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3651 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3652 case T.Mixin:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3653 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3654 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3655 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3656 e = new MixinExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3657 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3658 case T.Import:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3659 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3660 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3661 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3662 e = new ImportExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3663 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3664 case T.Typeid:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3665 requireNext(T.LParen);
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3666 auto type = parseType();
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3667 require(T.RParen);
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
3668 e = new TypeidExpression(type);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3669 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3670 case T.Is:
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3671 requireNext(T.LParen);
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3672
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3673 Type type, specType;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
3674 Token* ident; // optional Identifier
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3675 Token* opTok, specTok;
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3676
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3677 type = parseDeclarator(ident, true);
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3678
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3679 switch (token.type)
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3680 {
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3681 case T.Colon, T.Equal:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3682 opTok = token;
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3683 nT();
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3684 switch (token.type)
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3685 {
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3686 case T.Typedef,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3687 T.Struct,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3688 T.Union,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3689 T.Class,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3690 T.Interface,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3691 T.Enum,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3692 T.Function,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3693 T.Delegate,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3694 T.Super,
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3695 T.Return:
493
d13502b6fa5f Added code to the Parser and edited main.wiki.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 492
diff changeset
3696 case_Const_Invariant:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3697 specTok = token;
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3698 nT();
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3699 break;
493
d13502b6fa5f Added code to the Parser and edited main.wiki.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 492
diff changeset
3700 case T.Const, T.Invariant:
d13502b6fa5f Added code to the Parser and edited main.wiki.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 492
diff changeset
3701 if (peekNext() != T.LParen)
d13502b6fa5f Added code to the Parser and edited main.wiki.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 492
diff changeset
3702 goto case_Const_Invariant;
d13502b6fa5f Added code to the Parser and edited main.wiki.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 492
diff changeset
3703 // Fall through. It's a type.
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3704 default:
248
63a15b082c0c - Removed class SpecializationType.
aziz
parents: 247
diff changeset
3705 specType = parseType();
100
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3706 }
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3707 default:
538e8b546669 - Added code for parsing IsExpressions.
aziz
parents: 99
diff changeset
3708 }
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3709
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3710 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3711 version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3712 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3713 // is ( Type Identifier : TypeSpecialization , TemplateParameterList )
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3714 // is ( Type Identifier == TypeSpecialization , TemplateParameterList )
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3715 if (ident && specType && token.type == T.Comma)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3716 tparams = parseTemplateParameterList2();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3717 }
102
6e8b67ae15b7 - Added modules Declarations and Statements.
aziz
parents: 101
diff changeset
3718 require(T.RParen);
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
3719 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
3720 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3721 case T.LParen:
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3722 if (tokenAfterParenIs(T.LBrace))
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3723 {
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3724 auto parameters = parseParameterList();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3725 // ( ParameterList ) FunctionBody
267
f3dfa6208ed3 - Removed parameter func from parseFunctionBody(). Creating new FunctionBody inside the method.
aziz
parents: 266
diff changeset
3726 auto funcBody = parseFunctionBody();
289
a99357783c6f - Fix: assign targs to member targs of TraitsExpression.
aziz
parents: 288
diff changeset
3727 e = new FunctionLiteralExpression(null, parameters, funcBody);
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3728 }
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3729 else
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3730 {
131
ce636f3981cc - Removed TOK.Number.
aziz
parents: 130
diff changeset
3731 // ( Expression )
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3732 nT();
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3733 e = parseExpression();
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3734 require(T.RParen);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3735 // TODO: create ParenExpression?
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
3736 }
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3737 break;
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
3738 // IntegralType . Identifier
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3739 case T.Char, T.Wchar, T.Dchar, T.Bool,
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3740 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3741 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3742 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3743 T.Ifloat, T.Idouble, T.Ireal,
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3744 T.Cfloat, T.Cdouble, T.Creal, T.Void:
280
1eb54f6f392e - Made class Type abstract.
aziz
parents: 272
diff changeset
3745 auto type = new IntegralType(token.type);
247
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3746 nT();
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3747 set(type, begin);
11a67ec83281 - Call set() on type variable.
aziz
parents: 246
diff changeset
3748 require(T.Dot);
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
3749 auto ident = requireId();
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
3750
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3751 e = new TypeDotIdExpression(type, ident);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3752 break;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3753 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3754 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3755 case T.Traits:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3756 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3757 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3758 auto id = requireId();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3759 TemplateArguments args;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3760 if (token.type == T.Comma)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3761 args = parseTemplateArguments2();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3762 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3763 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3764 e = new TraitsExpression(id, args);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3765 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3766 }
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
3767 default:
343
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3768 if (token.isSpecialToken)
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3769 {
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3770 e = new SpecialTokenExpression(token);
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3771 nT();
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3772 break;
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3773 }
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 342
diff changeset
3774
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3775 error(MID.ExpectedButFound, "Expression", token.srcText);
136
96468715ea79 - Returning EmptyExpression in parsePrimaryExpression() when no token matched.
aziz
parents: 135
diff changeset
3776 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
3777 if (!trying)
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3778 {
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3779 // 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
3780 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
3781 prevToken = begin;
9c69615a4876 Added method insertEmptyTokenBefore() to Lexer. Made some fixes, too.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 409
diff changeset
3782 }
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3783 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3784 set(e, begin);
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
3785 return e;
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3786 }
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
3787
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3788 Expression parseNewExpression(/*Expression e*/)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3789 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3790 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
3791 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
3792 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
3793
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3794 Expression[] newArguments;
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3795 Expression[] ctorArguments;
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3796
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3797 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
3798 newArguments = parseArguments();
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3799
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3800 // NewAnonClassExpression:
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3801 // 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
3802 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
3803 {
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3804 nT();
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3805 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
3806 ctorArguments = parseArguments();
144
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3807
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3808 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
3809
495
b60450804b6e Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 494
diff changeset
3810 auto decls = parseDeclarationDefinitionsBody();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3811 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
3812 }
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3813
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3814 // NewExpression:
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3815 // NewArguments Type [ AssignExpression ]
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3816 // NewArguments Type ( ArgumentList )
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3817 // NewArguments Type
cfd890b250e6 - Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
aziz
parents: 143
diff changeset
3818 auto type = parseType();
302
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3819
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3820 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
3821 ctorArguments = parseArguments();
302
d04a79e795a2 - Fix in parseNewExpression(): removed check for type id.
aziz
parents: 301
diff changeset
3822
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3823 return set(new NewExpression(/*e, */newArguments, type, ctorArguments), begin);
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3824 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
3825
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3826 Type parseType()
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3827 {
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
3828 return parseBasicType2(parseBasicType());
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3829 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3830
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3831 Type parseBasicType()
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3832 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3833 auto begin = token;
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3834 Type t;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3835 // IdentifierType tident;
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3836
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3837 switch (token.type)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3838 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3839 case T.Char, T.Wchar, T.Dchar, T.Bool,
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3840 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3841 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3842 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3843 T.Ifloat, T.Idouble, T.Ireal,
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3844 T.Cfloat, T.Cdouble, T.Creal, T.Void:
280
1eb54f6f392e - Made class Type abstract.
aziz
parents: 272
diff changeset
3845 t = new IntegralType(token.type);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3846 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3847 set(t, begin);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3848 break;
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
3849 case T.Identifier, T.Typeof, T.Dot:
154
0e7cefb15e43 - Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
aziz
parents: 153
diff changeset
3850 t = parseDotListType();
484
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
3851 assert(!isNodeSet(t));
265c0b655f18 Added more calls to set().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 483
diff changeset
3852 set(t, begin);
153
66790fc2c0a2 - Added method parseIdentifierListType().
aziz
parents: 152
diff changeset
3853 break;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3854 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3855 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3856 case T.Const:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3857 // const ( Type )
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3858 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3859 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3860 t = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3861 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3862 t = new ConstType(t);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3863 set(t, begin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3864 break;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3865 case T.Invariant:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3866 // invariant ( Type )
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3867 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3868 require(T.LParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3869 t = parseType();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3870 require(T.RParen);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3871 t = new InvariantType(t);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3872 set(t, begin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
3873 break;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3874 } // version(D2)
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3875 default:
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3876 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
3877 t = new UndefinedType();
259
8118da6fee44 - Moved nT() below statement where an attribute class is constructed.
aziz
parents: 258
diff changeset
3878 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3879 set(t, begin);
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3880 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3881 return t;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3882 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
3883
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3884 Type parseBasicType2(Type t)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3885 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3886 typeof(token) begin;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3887 while (1)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3888 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3889 begin = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3890 switch (token.type)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3891 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3892 case T.Mul:
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3893 t = new PointerType(t);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3894 nT();
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3895 break;
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
3896 case T.LBracket:
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3897 t = parseArrayType(t);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3898 continue;
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3899 case T.Function, T.Delegate:
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3900 TOK tok = token.type;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3901 nT();
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
3902 auto parameters = parseParameterList();
135
145e0d68ec95 - Added enum TID to module Type.
aziz
parents: 134
diff changeset
3903 if (tok == T.Function)
291
c0e857931ff6 - Changed FunctionType and DelegateType. Both receive return type and parameters.
aziz
parents: 290
diff changeset
3904 t = new FunctionType(t, parameters);
135
145e0d68ec95 - Added enum TID to module Type.
aziz
parents: 134
diff changeset
3905 else
291
c0e857931ff6 - Changed FunctionType and DelegateType. Both receive return type and parameters.
aziz
parents: 290
diff changeset
3906 t = new DelegateType(t, parameters);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3907 break;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3908 default:
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3909 return t;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3910 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3911 set(t, begin);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3912 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3913 assert(0);
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
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3916 bool tokenAfterParenIs(TOK tok)
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3917 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3918 // 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
3919 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
3920 Token* next = token;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3921 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
3922 Loop:
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3923 while (1)
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3924 {
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3925 lx.peek(next);
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3926 switch (next.type)
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3927 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3928 case T.RParen:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3929 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
3930 { // 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
3931 do
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3932 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
3933 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
3934 break Loop;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3935 }
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3936 break;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3937 case T.LParen:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3938 ++level;
434
cac9c8d637ad Fix: members related to error info weren't updated correctly.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 429
diff changeset
3939 break;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3940 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
3941 break Loop;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3942 default:
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3943 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3944 }
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3945 return next.type == tok;
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3946 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3947
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3948 Type parseDeclaratorSuffix(Type t)
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3949 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3950 switch (token.type)
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3951 {
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3952 case T.LBracket:
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3953 // Type Identifier ArrayType
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3954 // ArrayType := [] or [Type] or [Expression..Expression]
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3955 do
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3956 t = parseArrayType(t);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3957 while (token.type == T.LBracket)
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3958 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3959 /+ // parsed in parseDeclaration()
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3960 case T.LParen:
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
3961 TemplateParameters tparams;
232
2a4e2c8ca094 - Renamed method isTemplateParameterList() to tokenAfterParenIs().
aziz
parents: 231
diff changeset
3962 if (tokenAfterParenIs(T.LParen))
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3963 {
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3964 // ( TemplateParameterList ) ( ParameterList )
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3965 tparams = parseTemplateParameterList();
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3966 }
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3967
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3968 auto params = parseParameterList();
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3969 // ReturnType FunctionName ( ParameterList )
196
ea3f66901fa4 - Added code for parsing template parameter lists for functions.
aziz
parents: 195
diff changeset
3970 t = new FunctionType(t, params, tparams);
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3971 break;
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
3972 +/
192
5c898f80b436 - Started implementation of parseDeclaration().
aziz
parents: 191
diff changeset
3973 default:
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3974 break;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3975 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3976 return t;
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3977 }
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
3978
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3979 Type parseArrayType(Type t)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3980 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3981 assert(token.type == T.LBracket);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
3982 auto begin = token;
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3983 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3984 if (token.type == T.RBracket)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3985 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3986 t = new ArrayType(t);
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3987 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3988 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3989 else
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
3990 {
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
3991 bool success;
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3992 Type parseAAType()
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3993 {
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3994 auto type = parseType();
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3995 require(T.RBracket);
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3996 return type;
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
3997 }
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
3998 auto assocType = try_(&parseAAType, success);
214
45fc474c1678 - Changed 'failed' parameter of try_() to 'success'.
aziz
parents: 213
diff changeset
3999 if (success)
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4000 t = new ArrayType(t, assocType);
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4001 else
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4002 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4003 Expression e = parseExpression(), e2;
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4004 if (token.type == T.Slice)
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4005 {
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4006 nT();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4007 e2 = parseExpression();
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4008 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4009 t = new ArrayType(t, e, e2);
369
27767e203d64 - Added override attribute to ImportParser.start().
aziz
parents: 368
diff changeset
4010 require(T.RBracket);
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4011 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4012 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4013 set(t, begin);
106
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4014 return t;
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4015 }
441962b0f526 - Added parseArrayType() method.
aziz
parents: 105
diff changeset
4016
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4017 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
4018 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4019 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
4020 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
4021 auto begin = token;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4022 nT(); // Skip (
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4023 type = parseBasicType2(type);
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4024 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
4025 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4026 // Can be nested.
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4027 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
4028 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4029 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
4030 {
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4031 // 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
4032 ident = token;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4033 nT();
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4034 type = parseDeclaratorSuffix(type);
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4035 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4036 require(T.RParen);
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4037
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4038 Parameters params;
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4039 if (optionalParamList)
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4040 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
4041 else
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4042 params = parseParameterList();
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4043
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4044 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
4045 return type;
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4046 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4047
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4048 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
4049 {
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
4050 auto t = parseType();
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
4051
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4052 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
4053 {
483
180711cc4b66 Fixed parsing of C-style function pointers.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 434
diff changeset
4054 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
4055 }
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4056 else if (token.type == T.Identifier)
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
4057 {
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4058 ident = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4059 nT();
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
4060 t = parseDeclaratorSuffix(t);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4061 }
409
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4062
38fccd2640eb Added code for parsing C function pointer declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 406
diff changeset
4063 if (ident is null && !identOptional)
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
4064 expected(T.Identifier);
98
aec3b16144fe - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement.
aziz
parents: 97
diff changeset
4065
104
b535016f8c3f - DeclaratorSuffix must be parsed after an Identifier.
aziz
parents: 103
diff changeset
4066 return t;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4067 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4068
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4069 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4070 Parse a list of AssignExpressions.
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4071 ExpressionList:
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4072 AssignExpression
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4073 AssignExpression , ExpressionList
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4074 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4075 Expression[] parseExpressionList()
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4076 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4077 Expression[] expressions;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4078 while (1)
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4079 {
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4080 expressions ~= parseAssignExpression();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4081 if (token.type != T.Comma)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4082 break;
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4083 nT();
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4084 }
486
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4085 return expressions;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4086 }
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4087
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4088 /++
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4089 Arguments:
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4090 ( )
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4091 ( ExpressionList )
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4092 +/
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4093 Expression[] parseArguments()
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4094 {
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4095 assert(token.type == T.LParen);
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4096 nT();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4097 Expression[] args;
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4098 if (token.type != TOK.RParen)
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4099 args = parseExpressionList();
bd176bc73e43 Fixed a few things in the Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 485
diff changeset
4100 require(TOK.RParen);
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4101 return args;
138
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4102 }
91b5187ed775 - Moved parseArgumentList() down a bit.
aziz
parents: 137
diff changeset
4103
143
e760d7552f66 - Renamed parseArgumentList() to parseArguments().
aziz
parents: 141
diff changeset
4104 Parameters parseParameterList()
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4105 out(params)
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4106 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4107 if (params.length > 1)
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4108 foreach (param; params.items[0..$-1])
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4109 {
117
79857de26e86 - Moved class Parameter to module Types. Added struct Parameters.
aziz
parents: 116
diff changeset
4110 if (param.isVariadic())
96
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4111 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
4112 }
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4113 }
d12d31d5fc17 - Added out-contract to parseParameters().
aziz
parents: 95
diff changeset
4114 body
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4115 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4116 auto begin = token;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4117 require(T.LParen);
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4118
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4119 auto params = new Parameters();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4120
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4121 if (token.type == T.RParen)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4122 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4123 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4124 return set(params, begin);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4125 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4126
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4127 while (1)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4128 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4129 auto paramBegin = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4130 Token* stcTok;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4131 StorageClass stc, tmp;
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 (token.type == T.Ellipses)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4134 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4135 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4136 params ~= set(new Parameter(null, null, null, null), paramBegin);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4137 break; // Exit loop.
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4138 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4139
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4140 Lstc_loop:
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4141 switch (token.type)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4142 {
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4143 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4144 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4145 case T.Invariant: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4146 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4147 goto default;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4148 tmp = StorageClass.Invariant;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4149 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4150 case T.Const: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4151 if (peekNext() == T.LParen)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4152 goto default;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4153 tmp = StorageClass.Const;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4154 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4155 case T.Final: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4156 tmp = StorageClass.Final;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4157 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4158 case T.Scope: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4159 tmp = StorageClass.Scope;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4160 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4161 case T.Static: // D2.0
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4162 tmp = StorageClass.Static;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4163 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4164 case T.In:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4165 tmp = StorageClass.In;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4166 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4167 case T.Out:
282
74113a9aa77c - Fix: assigned wrong StorageClass to variable.
aziz
parents: 280
diff changeset
4168 tmp = StorageClass.Out;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4169 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4170 case T.Inout, T.Ref:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4171 tmp = StorageClass.Ref;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4172 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4173 case T.Lazy:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4174 tmp = StorageClass.Lazy;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4175 goto Lcommon;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4176 Lcommon:
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4177 if (stc & tmp)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4178 error(MID.RedundantStorageClass, token.srcText);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4179 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4180 stc |= tmp;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4181 nT();
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4182 goto Lstc_loop;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4183 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4184 else // else body of version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4185 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4186 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
4187 stcTok = token;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4188 nT();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4189 goto default;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4190 }
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4191 default:
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4192 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4193 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4194 if (stc != StorageClass.None)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4195 stcTok = begin;
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4196 }
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4197 Token* ident;
130
0467f01ed524 - Fix: parameters can have optional identifier.
aziz
parents: 129
diff changeset
4198 auto type = parseDeclarator(ident, true);
99
6b8c248f5911 - Added member type to classes CastExpression and TypeidExpression.
aziz
parents: 98
diff changeset
4199
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4200 Expression assignExpr;
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4201 if (token.type == T.Assign)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4202 {
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4203 nT();
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4204 assignExpr = parseAssignExpression();
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4205 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4206
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4207 if (token.type == T.Ellipses)
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4208 {
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4209 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
4210 p.stc |= StorageClass.Variadic;
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4211 params ~= p;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4212 nT();
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4213 break; // Exit loop.
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4214 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4215
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4216 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
4217
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4218 if (token.type != T.Comma)
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4219 break; // Exit loop.
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4220 nT();
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4221 continue;
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4222 }
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4223 break; // Exit loop.
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4224 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4225 require(T.RParen);
242
7ec7ad8df9da - Changed type of member tok in class BinaryExpression to Token*.
aziz
parents: 240
diff changeset
4226 return set(params, begin);
95
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4227 }
0eb4c8a5b32b - Added TOK.Invalid.
aziz
parents: 94
diff changeset
4228
150
753bc07bf3a0 - Forgot to pass ident to constructor of TemplateArgument.
aziz
parents: 149
diff changeset
4229 TemplateArguments parseTemplateArguments()
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4230 {
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4231 TemplateArguments targs;
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4232 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
4233 if (token.type != T.RParen)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4234 targs = parseTemplateArguments_();
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4235 require(T.RParen);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4236 return targs;
139
d48f345b05f8 - Implemented parseTemplateArgumentList().
aziz
parents: 138
diff changeset
4237 }
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4238
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4239 version(D2)
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4240 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4241 TemplateArguments parseTemplateArguments2()
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4242 {
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4243 assert(token.type == T.Comma);
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4244 nT();
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4245 TemplateArguments targs;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4246 if (token.type != T.RParen)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4247 targs = parseTemplateArguments_();
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4248 else
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4249 error(MID.ExpectedButFound, "Type/Expression", ")");
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4250 require(T.RParen);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4251 return targs;
269
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4252 }
a416e09c08ea - Implemented D 2.0 additions.
aziz
parents: 268
diff changeset
4253 } // version(D2)
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4254
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4255 TemplateArguments parseTemplateArguments_()
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4256 {
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4257 auto begin = token;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4258 auto targs = new TemplateArguments;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4259 while (1)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4260 {
379
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4261 Type parseType_()
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4262 {
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4263 auto type = parseType();
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4264 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
4265 return type;
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4266 ++errorCount; // Cause try_() to fail.
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4267 return null;
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 377
diff changeset
4268 }
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4269 bool success;
423
6057113f9a44 Refactored Parser.try_().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
4270 auto typeArgument = try_(&parseType_, success);
376
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4271 if (success)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4272 // TemplateArgument:
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4273 // Type
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4274 // Symbol
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4275 targs ~= typeArgument;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4276 else
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4277 // TemplateArgument:
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4278 // AssignExpression
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4279 targs ~= parseAssignExpression();
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4280 if (token.type != T.Comma)
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4281 break; // Exit loop.
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4282 nT();
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4283 }
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4284 set(targs, begin);
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4285 return targs;
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4286 }
5ebe80ce84f2 - Separated common code to parseTemplateArguments_().
aziz
parents: 375
diff changeset
4287
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4288 TemplateParameters parseTemplateParameterList()
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4289 {
377
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4290 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4291 require(T.LParen);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4292 if (token.type != T.RParen)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4293 tparams = parseTemplateParameterList_();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4294 require(T.RParen);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4295 return tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4296 }
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4297
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4298 version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4299 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4300 TemplateParameters parseTemplateParameterList2()
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4301 {
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4302 assert(token.type == T.Comma);
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4303 nT();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4304 TemplateParameters tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4305 if (token.type != T.RParen)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4306 tparams = parseTemplateParameterList_();
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4307 else
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4308 error(MID.ExpectedButFound, "Type/Expression", ")");
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4309 return tparams;
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4310 }
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4311 } // version(D2)
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4312
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4313 TemplateParameters parseTemplateParameterList_()
906599374b69 - Added tparams member to IsExpression.
aziz
parents: 376
diff changeset
4314 {
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4315 auto begin = token;
295
75b47c71a34c - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 293
diff changeset
4316 auto tparams = new TemplateParameters;
75b47c71a34c - Assigning to Node.children in several constructors that inherit from Node.
aziz
parents: 293
diff changeset
4317
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4318 while (1)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4319 {
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4320 auto paramBegin = token;
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4321 TemplateParameter tp;
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4322 Token* ident;
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4323 Type specType, defType;
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4324
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4325 void parseSpecAndOrDefaultType()
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4326 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4327 // : SpecializationType
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4328 if (token.type == T.Colon)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4329 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4330 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4331 specType = parseType();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4332 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4333 // = DefaultType
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4334 if (token.type == T.Assign)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4335 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4336 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4337 defType = parseType();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4338 }
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4339 }
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4341 switch (token.type)
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4342 {
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4343 case T.Alias:
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4344 // TemplateAliasParameter:
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4345 // alias Identifier
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4346 nT(); // Skip alias keyword.
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4347 ident = requireId();
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4348 parseSpecAndOrDefaultType();
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4349 tp = new TemplateAliasParameter(ident, specType, defType);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4350 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4351 case T.Identifier:
253
4279b638c63e - Changed some string types to Token*. Adapted parser accordingly.
aziz
parents: 252
diff changeset
4352 ident = token;
238
f3c6c15961bb - Added method peekNext(). Replaced code that used lx.peek() with peekNext().
aziz
parents: 237
diff changeset
4353 switch (peekNext())
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4354 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4355 case T.Ellipses:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4356 // TemplateTupleParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4357 // Identifier ...
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4358 nT(); // Skip Identifier.
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4359 nT(); // Skip Ellipses.
341
3ac651ea83fb - Fix: created TemplateAliasParameter instead of TemplateTypeParameter.
aziz
parents: 340
diff changeset
4360 if (token.type == T.Comma)
342
f13d551d7c4f - Added error messages MID.InContract and MID.OutContract.
aziz
parents: 341
diff changeset
4361 error(MID.TemplateTupleParameter);
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4362 tp = new TemplateTupleParameter(ident);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4363 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4364 case T.Comma, T.RParen, T.Colon, T.Assign:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4365 // TemplateTypeParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4366 // Identifier
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4367 nT(); // Skip Identifier.
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4368 parseSpecAndOrDefaultType();
341
3ac651ea83fb - Fix: created TemplateAliasParameter instead of TemplateTypeParameter.
aziz
parents: 340
diff changeset
4369 tp = new TemplateTypeParameter(ident, specType, defType);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4370 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4371 default:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4372 // TemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4373 // Declarator
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4374 ident = null;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4375 goto LTemplateValueParameter;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4376 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4377 break;
492
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4378 version(D2)
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4379 {
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4380 case T.This:
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4381 // TemplateThisParameter
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4382 // this TemplateTypeParameter
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4383 nT(); // Skip 'this' keyword.
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4384 ident = requireId();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4385 parseSpecAndOrDefaultType();
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4386 tp = new TemplateThisParameter(ident, specType, defType);
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4387 break;
9c208925a3d4 Added module ImportParser and new stuff from DMD2.008.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 491
diff changeset
4388 }
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4389 default:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4390 LTemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4391 // TemplateValueParameter:
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4392 // Declarator
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4393 Expression specValue, defValue;
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4394 auto valueType = parseDeclarator(ident);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4395 // : SpecializationValue
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4396 if (token.type == T.Colon)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4397 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4398 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4399 specValue = parseCondExpression();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4400 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4401 // = DefaultValue
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4402 if (token.type == T.Assign)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4403 {
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4404 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4405 defValue = parseCondExpression();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4406 }
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4407 tp = new TemplateValueParameter(valueType, ident, specValue, defValue);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4408 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4409
340
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4410 // Push template parameter.
1accb3013bd2 - Changed class TemplateParameter to an abstract class.
aziz
parents: 335
diff changeset
4411 tparams ~= set(tp, paramBegin);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4412
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4413 if (token.type != T.Comma)
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4414 break;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4415 nT();
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4416 }
258
112a57f433f2 - Created class TemplateParameters.
aziz
parents: 257
diff changeset
4417 set(tparams, begin);
137
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4418 return tparams;
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4419 }
b49903801f14 - Implemented parseTemplateParameters().
aziz
parents: 136
diff changeset
4420
124
d4c4cea6ee7f - Renamed method errorIfNot() to expected().
aziz
parents: 123
diff changeset
4421 void expected(TOK tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4422 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
4423 if (token.type != tok)
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
4424 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
4425 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4426
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4427 void require(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4428 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
4429 if (token.type == tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4430 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4431 else
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
4432 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
4433 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4434
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4435 void requireNext(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4436 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4437 nT();
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4438 require(tok);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4439 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
4440
243
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4441 Token* requireId()
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4442 {
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4443 if (token.type == T.Identifier)
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4444 {
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4445 auto id = token;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4446 nT();
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4447 return id;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4448 }
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4449 else
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4450 error(MID.ExpectedButFound, "Identifier", token.srcText);
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4451 return null;
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4452 }
461e544ebb53 - Added method requireId().
aziz
parents: 242
diff changeset
4453
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
4454 void error(MID mid, ...)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
4455 {
213
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4456 if (trying)
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4457 {
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4458 ++errorCount;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4459 return;
b0ebde88d2d4 - Added members trying, errorCount and prev (for debugging) to Parser.
aziz
parents: 206
diff changeset
4460 }
491
b991f49628a8 Forgot committing Parser.d as well.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 489
diff changeset
4461 auto location = this.token.getLocation();
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 484
diff changeset
4462 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
4463 errors ~= new Information(InfoType.Parser, mid, location, msg);
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
4464 }
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
4465 }