annotate trunk/src/Parser.d @ 94:0fe650a7a8d1

- Renamed Type enum to InfoType in module Information. - Changed 'TOK type' member of TypeDotIdExpression to 'Type type'. - Added module Types. - Implemented most of parseBasicType(). - Indented code of 'BasicType . Identifier' parser and creating Type instance.
author aziz
date Fri, 06 Jul 2007 15:23:04 +0000
parents 9f8b6c205ecc
children 0eb4c8a5b32b
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
8ba2570de175 Initial import.
aziz
parents:
diff changeset
3 License: GPL2
8ba2570de175 Initial import.
aziz
parents:
diff changeset
4 +/
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
5 module Parser;
69
24db7c5522d5 - Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents: 68
diff changeset
6 import Lexer;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
7 import Token;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
8 import Messages;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
9 import Information;
70
0d3ef6daec04 - Added Expression class stubs.
aziz
parents: 69
diff changeset
10 import Expressions;
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
11 import Types;
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
12
68
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
13 enum STC
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
14 {
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
15 Abstract,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
16 Auto,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
17 Const,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
18 Deprecated,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
19 Extern,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
20 Final,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
21 Invariant,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
22 Override,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
23 Scope,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
24 Static,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
25 Synchronized
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
26 }
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
27
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
28 private alias TOK T;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
29
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
30 class Parser
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
31 {
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
32 Lexer lx;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
33 Token* token;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
34
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
35 Information[] errors;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
36
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
37 this(char[] srcText, string fileName)
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
38 {
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
39 lx = new Lexer(srcText, fileName);
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
40 }
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
41
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
42 void nT()
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 lx.nextToken();
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
45 token = &lx.token;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
46 }
70
0d3ef6daec04 - Added Expression class stubs.
aziz
parents: 69
diff changeset
47
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
48 Expression parseExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
49 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
50 auto e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
51 while (token.type == TOK.Comma)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
52 e = new CommaExpression(e, parseAssignExpression());
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
53 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
54 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
55
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
56 Expression parseAssignExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
57 {
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
58 auto e = parseCondExpression();
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
59 while (1)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
60 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
61 switch (token.type)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
62 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
63 case T.Assign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
64 nT(); e = new AssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
65 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
66 case T.LShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
67 nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
68 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
69 case T.RShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
70 nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
71 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
72 case T.URShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
73 nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
74 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
75 case T.OrAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
76 nT(); e = new OrAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
77 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
78 case T.AndAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
79 nT(); e = new AndAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
80 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
81 case T.PlusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
82 nT(); e = new PlusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
83 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
84 case T.MinusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
85 nT(); e = new MinusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
86 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
87 case T.DivAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
88 nT(); e = new DivAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
89 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
90 case T.MulAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
91 nT(); e = new MulAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
92 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
93 case T.ModAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
94 nT(); e = new ModAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
95 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
96 case T.XorAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
97 nT(); e = new XorAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
98 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
99 case T.CatAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
100 nT(); e = new CatAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
101 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
102 default:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
103 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
104 }
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
105 break;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
106 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
107 return e;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
108 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
109
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
110 Expression parseCondExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
111 {
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
112 auto e = parseOrOrExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
113 if (token.type == T.Question)
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
114 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
115 nT();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
116 auto iftrue = parseExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
117 require(T.Colon);
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
118 auto iffalse = parseCondExpression();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
119 e = new CondExpression(e, iftrue, iffalse);
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
120 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
121 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
122 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
123
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
124 Expression parseOrOrExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
125 {
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
126 alias parseAndAndExpression parseNext;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
127 auto e = parseNext();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
128 if (token.type == T.OrLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
129 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
130 nT();
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
131 e = new OrOrExpression(e, parseNext());
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
132 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
133 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
134 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
135
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
136 Expression parseAndAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
137 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
138 alias parseOrExpression parseNext;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
139 auto e = parseNext();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
140 if (token.type == T.AndLogical)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
141 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
142 nT();
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
143 e = new AndAndExpression(e, parseNext());
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
144 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
145 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
146 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
147
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
148 Expression parseOrExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
149 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
150 alias parseXorExpression parseNext;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
151 auto e = parseNext();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
152 if (token.type == T.OrBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
153 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
154 nT();
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
155 e = new OrExpression(e, parseNext());
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
156 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
157 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
158 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
159
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
160 Expression parseXorExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
161 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
162 alias parseAndExpression parseNext;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
163 auto e = parseNext();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
164 if (token.type == T.Xor)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
165 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
166 nT();
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
167 e = new XorExpression(e, parseNext());
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
168 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
169 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
170 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
171
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
172 Expression parseAndExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
173 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
174 alias parseCmpExpression parseNext;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
175 auto e = parseNext();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
176 if (token.type == T.AndBinary)
73
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
177 {
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
178 nT();
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
179 e = new AndExpression(e, parseNext());
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
180 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
181 return e;
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
182 }
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
183
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
184 Expression parseCmpExpression()
11572f4a138c - Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents: 72
diff changeset
185 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
186 TOK operator = token.type;
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
187
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
188 auto e = parseShiftExpression();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
189
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
190 switch (operator)
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
191 {
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
192 case T.Equal, T.NotEqual:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
193 nT();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
194 e = new EqualExpression(e, parseShiftExpression(), operator);
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
195 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
196 case T.Not:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
197 Token t;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
198 lx.peek(t);
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
199 if (t.type != T.Is)
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
200 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
201 nT();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
202 operator = T.NotIdentity;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
203 goto LNotIdentity;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
204 case T.Identity:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
205 operator = T.Identity;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
206 LNotIdentity:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
207 nT();
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
208 e = new IdentityExpression(e, parseShiftExpression(), operator);
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
209 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
210 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
211 T.Unordered, T.UorE, T.UorG, T.UorGorE,
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
212 T.UorL, T.UorLorE, T.LorEorG, T.LorG:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
213 nT();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
214 e = new RelExpression(e, parseShiftExpression(), operator);
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
215 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
216 case T.In:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
217 nT();
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
218 e = new InExpression(e, parseShiftExpression(), operator);
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
219 break;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
220 default:
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
221 }
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
222 return e;
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
223 }
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
224
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
225 Expression parseShiftExpression()
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
226 {
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
227 auto e = parseAddExpression();
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
228 while (1)
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
229 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
230 switch (token.type)
75
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
231 {
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
232 case T.LShift: nT(); e = new LShiftExpression(e, parseAddExpression()); break;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
233 case T.RShift: nT(); e = new RShiftExpression(e, parseAddExpression()); break;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
234 case T.URShift: nT(); e = new URShiftExpression(e, parseAddExpression()); break;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
235 default: break;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
236 }
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
237 break;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
238 }
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
239 return e;
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
240 }
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
241
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
242 Expression parseAddExpression()
3f976d9e0833 - Implemented parseShiftExpression().
aziz
parents: 74
diff changeset
243 {
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
244 auto e = parseMulExpression();
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
245 while (1)
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
246 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
247 switch (token.type)
76
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
248 {
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
249 case T.Plus: nT(); e = new PlusExpression(e, parseMulExpression()); break;
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
250 case T.Minus: nT(); e = new MinusExpression(e, parseMulExpression()); break;
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
251 case T.Tilde: nT(); e = new CatExpression(e, parseMulExpression()); break;
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
252 default: break;
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
253 }
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
254 break;
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
255 }
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
256 return new Expression();
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
257 }
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
258
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
259 Expression parseMulExpression()
a85f9edf6ce7 - Implemented parseAddExpression().
aziz
parents: 75
diff changeset
260 {
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
261 auto e = parseUnaryExpression();
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
262 while (1)
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
263 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
264 switch (token.type)
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
265 {
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
266 case T.Mul: nT(); e = new MulExpression(e, parseUnaryExpression()); break;
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
267 case T.Div: nT(); e = new DivExpression(e, parseUnaryExpression()); break;
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
268 case T.Mod: nT(); e = new ModExpression(e, parseUnaryExpression()); break;
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
269 default: break;
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
270 }
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
271 break;
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
272 }
74
30b0fb85dda9 - Implemented parseCmpExpression().
aziz
parents: 73
diff changeset
273 return new Expression();
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
274 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
275
91
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
276 Expression parseUnaryExpression()
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
277 {
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
278 Expression e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
279 switch (token.type)
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
280 {
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
281 case T.AndBinary:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
282 nT(); e = new AddressExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
283 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
284 case T.PlusPlus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
285 nT(); e = new PreIncrExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
286 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
287 case T.MinusMinus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
288 nT(); e = new PreDecrExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
289 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
290 case T.Mul:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
291 nT(); e = new DerefExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
292 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
293 case T.Minus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
294 case T.Plus:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
295 nT(); e = new SignExpression(parseUnaryExpression(), token.type);
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
296 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
297 case T.Not:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
298 nT(); e = new NotExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
299 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
300 case T.Tilde:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
301 nT(); e = new CompExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
302 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
303 case T.New:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
304 // parseNewExpression();
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
305 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
306 case T.Delete:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
307 nT();
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
308 e = new DeleteExpression(parseUnaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
309 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
310 case T.Cast:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
311 nT();
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
312 // Type type = parseType();
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
313 e = new CastExpression(parseUnaryExpression() /*, type*/);
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
314 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
315 case T.LParen:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
316 // parse ( Type ) . Identifier
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
317 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
318 default:
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
319 e = parsePostExpression(parsePrimaryExpression());
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
320 break;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
321 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
322 assert(e !is null);
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
323 return e;
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
324 }
ac8610aaf622 - Moved parseUnaryExpression() one place up in the method list.
aziz
parents: 90
diff changeset
325
90
a02950cb7036 - Fixed order of parsing unary, post and primary expressions.
aziz
parents: 89
diff changeset
326 Expression parsePostExpression(Expression e)
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
327 {
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
328 while (1)
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
329 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
330 switch (token.type)
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
331 {
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
332 case T.Dot:
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
333 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
334 if (token.type == T.Identifier)
92
6de2e6e7d872 - Fixed parsePostExpression().
aziz
parents: 91
diff changeset
335 {
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
336 e = new DotIdExpression(e);
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
337 break;
92
6de2e6e7d872 - Fixed parsePostExpression().
aziz
parents: 91
diff changeset
338 }
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
339 else if (token.type == T.New)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
340 e = parseNewExpression(e);
92
6de2e6e7d872 - Fixed parsePostExpression().
aziz
parents: 91
diff changeset
341 else
6de2e6e7d872 - Fixed parsePostExpression().
aziz
parents: 91
diff changeset
342 errorIfNot(T.Identifier);
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
343 continue;
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
344 case T.PlusPlus:
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
345 e = new PostIncrExpression(e);
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
346 break;
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
347 case T.MinusMinus:
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
348 e = new PostDecrExpression(e);
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
349 break;
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
350 case T.LParen:
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
351 e = new CallExpression(e, parseArgumentList(T.LParen));
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
352 continue;
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
353 case T.LBracket:
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
354 // parse Slice- and IndexExpression
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
355 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
356 if (token.type == T.RBracket)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
357 {
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
358 e = new SliceExpression(e, null, null);
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
359 break;
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
360 }
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
361
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
362 Expression[] es = [parseAssignExpression()];
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
363
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
364 if (token.type == T.Slice)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
365 {
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
366 nT();
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
367 e = new SliceExpression(e, es[0], parseAssignExpression());
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
368 require(T.RBracket);
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
369 continue;
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
370 }
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
371 else if (token.type == T.Comma)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
372 {
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
373 es ~= parseArgumentList(T.RBracket);
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
374 }
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
375 else
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
376 require(T.RBracket);
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
377
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
378 e = new IndexExpression(e, es);
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
379 continue;
92
6de2e6e7d872 - Fixed parsePostExpression().
aziz
parents: 91
diff changeset
380 default:
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
381 return e;
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
382 }
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
383 nT();
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
384 }
93
9f8b6c205ecc - Made fixes to the way the while loop in parsePostExpression() works.
aziz
parents: 92
diff changeset
385 assert(0);
79
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
386 }
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
387
df4e5c7ad58a - Implemented most of parsePostExpression() and parsePreExpression().
aziz
parents: 78
diff changeset
388 Expression parsePrimaryExpression()
78
f043759fb59a - Added code to parseUnaryExpression(); not fully implemented.
aziz
parents: 77
diff changeset
389 {
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
390 Expression e;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
391 switch (token.type)
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
392 {
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
393 case T.Identifier:
89
18c71269fb52 - Added code for parsing IdentifierExpression.
aziz
parents: 88
diff changeset
394 e = new IdentifierExpression(token.srcText);
18c71269fb52 - Added code for parsing IdentifierExpression.
aziz
parents: 88
diff changeset
395 nT();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
396 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
397 case T.Dot:
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
398 requireNext(T.Identifier);
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
399 e = new GlobalIdExpression(token.srcText);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
400 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
401 case T.This:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
402 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
403 e = new ThisExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
404 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
405 case T.Super:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
406 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
407 e = new SuperExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
408 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
409 case T.Null:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
410 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
411 e = new NullExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
412 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
413 case T.True, T.False:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
414 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
415 e = new BoolExpression(token.type == T.True ? true : false);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
416 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
417 case T.Dollar:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
418 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
419 e = new DollarExpression();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
420 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
421 case T.Int32/*, ...*/: // Number literals
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
422 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
423 case T.CharLiteral, T.WCharLiteral, T.DCharLiteral:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
424 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
425 e = new CharLiteralExpression(token.type);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
426 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
427 case T.String:
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
428 char[] buffer = token.str;
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
429 char postfix = token.pf;
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
430 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
431 while (token.type == T.String)
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
432 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
433 string tmp = token.str;
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
434 // if (postfix != token.pf)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
435 // error();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
436 if (tmp.length > 1)
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
437 {
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
438 buffer[$-1] = tmp[0]; // replace '\0'
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
439 buffer ~= tmp[1..$]; // append the rest
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
440 }
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
441 nT();
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
442 }
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
443 e = new StringLiteralExpression(buffer);
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
444 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
445 case T.LBracket:
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
446 Expression[] values;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
447
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
448 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
449 if (token.type != T.RBracket)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
450 {
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
451 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
452 if (token.type == T.Colon)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
453 goto LparseAssocArray;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
454 else if (token.type == T.Comma)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
455 values = [e] ~ parseArgumentList(T.RBracket);
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
456 else
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
457 require(T.RBracket);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
458 }
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
459
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
460 e = new ArrayLiteralExpression(values);
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
461 break;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
462
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
463 LparseAssocArray:
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
464 Expression[] keys;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
465
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
466 keys ~= e;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
467 nT(); // Skip colon.
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
468 values ~= parseAssignExpression();
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
469
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
470 if (token.type != T.RBracket)
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
471 {
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
472 require(T.Comma);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
473 while (1)
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
474 {
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
475 keys ~= parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
476 if (token.type != T.Colon)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
477 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
478 errorIfNot(T.Colon);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
479 values ~= null;
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
480 if (token.type == T.RBracket)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
481 break;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
482 else
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
483 continue;
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
484 }
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
485 nT();
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
486 values ~= parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
487 if (token.type == T.RBracket)
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
488 break;
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
489 require(T.Comma);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
490 }
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
491 }
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
492 assert(token.type == T.RBracket);
85
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
493 nT();
d8dc3171440d - Fixed parsing CallExpression and IndexExpression.
aziz
parents: 84
diff changeset
494 e = new AssocArrayLiteralExpression(keys, values);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
495 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
496 case T.LBrace:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
497 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
498 case T.Function, T.Delegate:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
499 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
500 case T.Assert:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
501 Expression msg;
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
502 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
503 e = parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
504 if (token.type == T.Comma)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
505 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
506 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
507 msg = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
508 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
509 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
510 e = new AssertExpression(e, msg);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
511 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
512 case T.Mixin:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
513 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
514 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
515 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
516 e = new MixinExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
517 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
518 case T.Import:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
519 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
520 e = parseAssignExpression();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
521 require(T.RParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
522 e = new ImportExpression(e);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
523 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
524 case T.Typeid:
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
525 requireNext(T.LParen);
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
526 e = new TypeidExpression();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
527 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
528 case T.Is:
89
18c71269fb52 - Added code for parsing IdentifierExpression.
aziz
parents: 88
diff changeset
529 // e = new IsExpression();
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
530 break;
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
531 case T.LParen:
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
532 break;
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
533 // BasicType . Identifier
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
534 case T.Void, T.Char, T.Wchar, T.Dchar, T.Bool,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
535 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
536 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
537 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
538 T.Ifloat, T.Idouble, T.Ireal,
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
539 T.Cfloat, T.Cdouble, T.Creal:
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
540 auto type = new Type(token.type);
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
541
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
542 requireNext(T.Dot);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
543
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
544 string ident;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
545 if (token.type == T.Identifier)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
546 {
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
547 ident = token.srcText;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
548 nT();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
549 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
550 else
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
551 errorIfNot(T.Identifier);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
552
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
553 e = new TypeDotIdExpression(type, ident);
84
ac8d961d10d1 - Added code for parsing This-,Super-,Null-,Bool-,Dollar-,CharLiteral- and StringLiteralExpression.
aziz
parents: 83
diff changeset
554 default:
90
a02950cb7036 - Fixed order of parsing unary, post and primary expressions.
aziz
parents: 89
diff changeset
555 // error();
83
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
556 }
9e6d66f647c9 - Fix: IsExpression was created instead of IdentityExpression.
aziz
parents: 81
diff changeset
557 return e;
77
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
558 }
7e21c4df1c02 - Implemented parseMulExpression().
aziz
parents: 76
diff changeset
559
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
560 Expression parseNewExpression(Expression e)
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
561 {
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
562 return null;
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
563 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
564
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
565 Expression[] parseArgumentList(TOK terminator)
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
566 {
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
567 Expression[] es;
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
568
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
569 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
570 if (token.type == terminator)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
571 {
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
572 nT();
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
573 return null;
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
574 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
575
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
576 while (1)
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
577 {
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
578 es ~= parseAssignExpression();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
579 if (token.type == terminator)
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
580 break;
88
81cb24669ed3 - Fixed parser of AssocArrayLiteralExpression.
aziz
parents: 87
diff changeset
581 require(T.Comma);
81
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
582 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
583 nT();
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
584 return es;
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
585 }
aa1ea2548dd9 - Fixed parseExpression() method.
aziz
parents: 80
diff changeset
586
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
587 Type parseBasicType()
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
588 {
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
589 Type t;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
590 IdentifierType tident;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
591
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
592 switch (token.type)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
593 {
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
594 case T.Void, T.Char, T.Wchar, T.Dchar, T.Bool,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
595 T.Byte, T.Ubyte, T.Short, T.Ushort,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
596 T.Int, T.Uint, T.Long, T.Ulong,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
597 T.Float, T.Double, T.Real,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
598 T.Ifloat, T.Idouble, T.Ireal,
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
599 T.Cfloat, T.Cdouble, T.Creal:
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
600 t = new Type(token.type);
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
601 nT();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
602 break;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
603 case T.Identifier, T.Dot:
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
604 tident = new IdentifierType([token.srcText]);
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
605 nT();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
606 // if (token.type == T.Not)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
607 // parse template instance
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
608 Lident:
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
609 while (token.type == T.Dot)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
610 {
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
611 nT();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
612 if (token.type == T.Identifier)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
613 {
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
614 tident ~= token.srcText;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
615 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
616 else
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
617 errorIfNot(T.Identifier);
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
618 nT();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
619 // if (token.type == T.Not)
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
620 // parse template instance
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
621 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
622 t = tident;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
623 break;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
624 case T.Typeof:
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
625 requireNext(T.LParen);
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
626 tident = new TypeofType(parseExpression());
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
627 require(T.RParen);
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
628 goto Lident;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
629 default:
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
630 // error();
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
631 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
632 return t;
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
633 }
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
634
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
635 void errorIfNot(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
636 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
637 if (token.type != tok)
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
638 error(MID.ExpectedButFound, tok, token.srcText);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
639 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
640
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
641 void require(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
642 {
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
643 if (token.type == tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
644 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
645 else
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
646 error(MID.ExpectedButFound, tok, token.srcText);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
647 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
648
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
649 void requireNext(TOK tok)
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
650 {
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
651 nT();
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
652 if (token.type == tok)
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
653 nT();
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
654 else
87
c9544b7d5c7d - Added member token and method nT(), which sets token to lx.token.
aziz
parents: 86
diff changeset
655 error(MID.ExpectedButFound, tok, token.srcText);
86
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
656 }
0459c902a370 - Added code for parsing Assert-, Mixin-, Import-, Typeid- and TypeDotIdExpressions.
aziz
parents: 85
diff changeset
657
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
658 void error(MID id, ...)
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
659 {
94
0fe650a7a8d1 - Renamed Type enum to InfoType in module Information.
aziz
parents: 93
diff changeset
660 errors ~= new Information(InfoType.Parser, id, lx.loc, arguments(_arguments, _argptr));
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
661 }
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
662 }