Mercurial > projects > dil
annotate trunk/src/Parser.d @ 76:a85f9edf6ce7
- Implemented parseAddExpression().
- Added stub for parseMulExpression().
- Added MinusExpression class.
author | aziz |
---|---|
date | Sun, 01 Jul 2007 19:28:02 +0000 |
parents | 3f976d9e0833 |
children | 7e21c4df1c02 |
rev | line source |
---|---|
0 | 1 /++ |
2 Author: Aziz Köksal | |
3 License: GPL2 | |
4 +/ | |
65 | 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 | 7 import Token; |
8 import Messages; | |
9 import Information; | |
70 | 10 import Expressions; |
65 | 11 |
68
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
12 enum STC |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
13 { |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
14 Abstract, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
15 Auto, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
16 Const, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
17 Deprecated, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
18 Extern, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
19 Final, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
20 Invariant, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
21 Override, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
22 Scope, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
23 Static, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
24 Synchronized |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
25 } |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
26 |
71 | 27 private alias TOK T; |
28 | |
65 | 29 class Parser |
30 { | |
71 | 31 Lexer lx; |
32 TOK delegate() nT; | |
33 | |
34 Information[] errors; | |
35 | |
36 this(char[] srcText, string fileName) | |
37 { | |
38 lx = new Lexer(srcText, fileName); | |
39 nT = &lx.nextToken; | |
40 } | |
70 | 41 |
72 | 42 Expression parseExpression() |
43 { | |
44 auto e = parseAssignExpression(); | |
45 while (lx.token.type == TOK.Comma) | |
46 e = new CommaExpression(e, parseExpression()); | |
47 return e; | |
48 } | |
49 | |
71 | 50 Expression parseAssignExpression() |
51 { | |
52 auto e = parseCondExpression(); | |
72 | 53 while (1) |
71 | 54 { |
72 | 55 switch (lx.token.type) |
56 { | |
57 case T.Assign: | |
58 nT(); e = new AssignExpression(e, parseAssignExpression()); | |
59 break; | |
60 case T.LShiftAssign: | |
61 nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); | |
62 break; | |
63 case T.RShiftAssign: | |
64 nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); | |
65 break; | |
66 case T.URShiftAssign: | |
67 nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); | |
68 break; | |
69 case T.OrAssign: | |
70 nT(); e = new OrAssignExpression(e, parseAssignExpression()); | |
71 break; | |
72 case T.AndAssign: | |
73 nT(); e = new AndAssignExpression(e, parseAssignExpression()); | |
74 break; | |
75 case T.PlusAssign: | |
76 nT(); e = new PlusAssignExpression(e, parseAssignExpression()); | |
77 break; | |
78 case T.MinusAssign: | |
79 nT(); e = new MinusAssignExpression(e, parseAssignExpression()); | |
80 break; | |
81 case T.DivAssign: | |
82 nT(); e = new DivAssignExpression(e, parseAssignExpression()); | |
83 break; | |
84 case T.MulAssign: | |
85 nT(); e = new MulAssignExpression(e, parseAssignExpression()); | |
86 break; | |
87 case T.ModAssign: | |
88 nT(); e = new ModAssignExpression(e, parseAssignExpression()); | |
89 break; | |
90 case T.XorAssign: | |
91 nT(); e = new XorAssignExpression(e, parseAssignExpression()); | |
92 break; | |
93 case T.CatAssign: | |
94 nT(); e = new CatAssignExpression(e, parseAssignExpression()); | |
95 break; | |
96 default: | |
97 break; | |
98 } | |
71 | 99 break; |
100 } | |
101 return e; | |
102 } | |
72 | 103 |
71 | 104 Expression parseCondExpression() |
105 { | |
72 | 106 auto e = parseOrOrExpression(); |
73
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
107 if (lx.token.type == T.Question) |
72 | 108 { |
109 nT(); | |
110 auto iftrue = parseExpression(); | |
111 // if (lx.toke.type != TOK.Colon) | |
112 // error(); | |
113 auto iffalse = parseCondExpression(); | |
114 e = new CondExpression(e, iftrue, iffalse); | |
115 } | |
116 return e; | |
117 } | |
118 | |
119 Expression parseOrOrExpression() | |
120 { | |
73
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
121 alias parseAndAndExpression parseNext; |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
122 auto e = parseNext(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
123 if (lx.token.type == T.OrLogical) |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
124 { |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
125 nT(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
126 e = new OrOrExpression(e, parseNext()); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
127 } |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
128 return e; |
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 |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
131 Expression parseAndAndExpression() |
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 alias parseOrExpression parseNext; |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
134 auto e = parseNext(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
135 if (lx.token.type == T.AndLogical) |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
136 { |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
137 nT(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
138 e = new AndAndExpression(e, parseNext()); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
139 } |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
140 return e; |
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 |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
143 Expression parseOrExpression() |
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 alias parseXorExpression parseNext; |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
146 auto e = parseNext(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
147 if (lx.token.type == T.OrBinary) |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
148 { |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
149 nT(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
150 e = new OrExpression(e, parseNext()); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
151 } |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
152 return e; |
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 |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
155 Expression parseXorExpression() |
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 alias parseAndExpression parseNext; |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
158 auto e = parseNext(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
159 if (lx.token.type == T.Xor) |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
160 { |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
161 nT(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
162 e = new XorExpression(e, parseNext()); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
163 } |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
164 return e; |
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 |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
167 Expression parseAndExpression() |
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 alias parseCmpExpression parseNext; |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
170 auto e = parseNext(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
171 if (lx.token.type == T.AndBinary) |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
172 { |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
173 nT(); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
174 e = new AndExpression(e, parseNext()); |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
175 } |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
176 return e; |
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 |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
179 Expression parseCmpExpression() |
11572f4a138c
- Added methods for parsing OrOrExpressions, AndAndExpressions, OrExpressions, XorExpressions and AndExpressions.
aziz
parents:
72
diff
changeset
|
180 { |
74 | 181 TOK operator = lx.token.type; |
182 | |
183 auto e = parseShiftExpression(); | |
184 | |
185 switch (operator) | |
186 { | |
187 case T.Equal, T.NotEqual: | |
188 nT(); | |
189 e = new EqualExpression(e, parseShiftExpression(), operator); | |
190 break; | |
191 case T.Not: | |
192 Token t; | |
193 lx.peek(t); | |
194 if (t.type != T.Is) | |
195 break; | |
196 nT(); | |
197 operator = T.NotIdentity; | |
198 goto LNotIdentity; | |
199 case T.Identity: | |
200 operator = T.Identity; | |
201 LNotIdentity: | |
202 nT(); | |
203 e = new IsExpression(e, parseShiftExpression(), operator); | |
204 break; | |
205 case T.LessEqual, T.Less, T.GreaterEqual, T.Greater, | |
206 T.Unordered, T.UorE, T.UorG, T.UorGorE, | |
207 T.UorL, T.UorLorE, T.LorEorG, T.LorG: | |
208 nT(); | |
209 e = new RelExpression(e, parseShiftExpression(), operator); | |
210 break; | |
211 case T.In: | |
212 nT(); | |
213 e = new InExpression(e, parseShiftExpression(), operator); | |
214 break; | |
215 default: | |
216 } | |
217 return e; | |
218 } | |
219 | |
220 Expression parseShiftExpression() | |
221 { | |
75 | 222 auto e = parseAddExpression(); |
223 while (1) | |
224 { | |
225 switch (lx.token.type) | |
226 { | |
227 case T.LShift: nT(); e = new LShiftExpression(e, parseAddExpression()); break; | |
228 case T.RShift: nT(); e = new RShiftExpression(e, parseAddExpression()); break; | |
229 case T.URShift: nT(); e = new URShiftExpression(e, parseAddExpression()); break; | |
230 default: break; | |
231 } | |
232 break; | |
233 } | |
234 return e; | |
235 } | |
236 | |
237 Expression parseAddExpression() | |
238 { | |
76 | 239 auto e = parseMulExpression(); |
240 while (1) | |
241 { | |
242 switch (lx.token.type) | |
243 { | |
244 case T.Plus: nT(); e = new PlusExpression(e, parseMulExpression()); break; | |
245 case T.Minus: nT(); e = new MinusExpression(e, parseMulExpression()); break; | |
246 case T.Tilde: nT(); e = new CatExpression(e, parseMulExpression()); break; | |
247 default: break; | |
248 } | |
249 break; | |
250 } | |
251 return new Expression(); | |
252 } | |
253 | |
254 Expression parseMulExpression() | |
255 { | |
74 | 256 return new Expression(); |
71 | 257 } |
258 | |
259 void error(MID id, ...) | |
260 { | |
261 errors ~= new Information(Information.Type.Parser, id, lx.loc, arguments(_arguments, _argptr)); | |
262 } | |
65 | 263 } |