Skip to content

Commit fbea4d0

Browse files
committed
More rustc expr-parsing logic.
1 parent 5b4b035 commit fbea4d0

File tree

2 files changed

+238
-22
lines changed

2 files changed

+238
-22
lines changed

src/comp/front/ast.rs

+14-16
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ type crate = rec(_mod module);
1010
type block = vec[@stmt];
1111

1212
tag binop {
13-
plus;
14-
minus;
15-
star;
16-
slash;
17-
percent;
18-
caret;
13+
add;
14+
sub;
15+
mul;
16+
div;
17+
rem;
18+
and;
19+
or;
20+
bitxor;
1921
bitand;
2022
bitor;
2123
lsl;
@@ -30,11 +32,11 @@ tag binop {
3032
}
3133

3234
tag unop {
35+
box;
36+
deref;
3337
bitnot;
3438
not;
3539
neg;
36-
deref;
37-
cast(@ty);
3840
}
3941

4042
tag stmt {
@@ -49,22 +51,18 @@ tag decl {
4951
decl_item(ident, @item);
5052
}
5153

52-
tag lval {
53-
lval_ident(ident);
54-
lval_ext(@lval, ident);
55-
lval_idx(@lval, @expr);
56-
}
57-
5854
tag expr {
59-
expr_box(@expr);
6055
expr_vec(vec[@expr]);
6156
expr_tup(vec[@expr]);
6257
expr_rec(vec[tup(ident,@expr)]);
6358
expr_call(@expr, vec[@expr]);
6459
expr_binary(binop, @expr, @expr);
6560
expr_unary(unop, @expr);
6661
expr_lit(@lit);
67-
expr_lval(@lval);
62+
expr_ident(ident);
63+
expr_field(@expr, ident);
64+
expr_index(@expr, @expr);
65+
expr_cast(@expr, ty);
6866
}
6967

7068
tag lit {

src/comp/front/parser.rs

+224-6
Original file line numberDiff line numberDiff line change
@@ -166,34 +166,252 @@ state fn parse_bottom_expr(parser p) -> @ast.expr {
166166
ret e;
167167
}
168168

169+
case (token.TUP) {
170+
p.bump();
171+
auto pf = parse_expr;
172+
auto es = parse_seq[@ast.expr](token.LPAREN,
173+
token.RPAREN,
174+
some(token.COMMA),
175+
pf, p);
176+
ret @ast.expr_tup(es);
177+
}
178+
179+
case (token.VEC) {
180+
p.bump();
181+
auto pf = parse_expr;
182+
auto es = parse_seq[@ast.expr](token.LPAREN,
183+
token.RPAREN,
184+
some(token.COMMA),
185+
pf, p);
186+
ret @ast.expr_vec(es);
187+
}
188+
189+
case (token.REC) {
190+
p.bump();
191+
state fn parse_entry(parser p) ->
192+
tup(ast.ident, @ast.expr) {
193+
auto i = parse_ident(p);
194+
expect(p, token.EQ);
195+
auto e = parse_expr(p);
196+
ret tup(i, e);
197+
}
198+
auto pf = parse_entry;
199+
auto es =
200+
parse_seq[tup(ast.ident, @ast.expr)](token.LPAREN,
201+
token.RPAREN,
202+
some(token.COMMA),
203+
pf, p);
204+
ret @ast.expr_rec(es);
205+
}
206+
207+
case (token.IDENT(?i)) {
208+
p.bump();
209+
ret @ast.expr_ident(i);
210+
}
211+
169212
case (_) {
170213
ret @ast.expr_lit(parse_lit(p));
171214
}
172215
}
173216
}
174217

218+
state fn parse_path_expr(parser p) -> @ast.expr {
219+
auto e = parse_bottom_expr(p);
220+
while (true) {
221+
alt (p.peek()) {
222+
case (token.DOT) {
223+
p.bump();
224+
alt (p.peek()) {
225+
226+
case (token.IDENT(?i)) {
227+
p.bump();
228+
e = @ast.expr_field(e, i);
229+
}
230+
231+
case (token.LPAREN) {
232+
auto ix = parse_bottom_expr(p);
233+
e = @ast.expr_index(e, ix);
234+
}
235+
}
236+
}
237+
case (_) {
238+
ret e;
239+
}
240+
}
241+
}
242+
ret e;
243+
}
175244

176-
state fn parse_negation_expr(parser p) -> @ast.expr {
245+
state fn parse_prefix_expr(parser p) -> @ast.expr {
177246
alt (p.peek()) {
178247

179248
case (token.NOT) {
180-
auto e = parse_negation_expr(p);
249+
auto e = parse_prefix_expr(p);
181250
ret @ast.expr_unary(ast.not, e);
182251
}
183252

184253
case (token.TILDE) {
185-
auto e = parse_negation_expr(p);
254+
auto e = parse_prefix_expr(p);
186255
ret @ast.expr_unary(ast.bitnot, e);
187256
}
188257

258+
case (token.BINOP(?b)) {
259+
alt (b) {
260+
261+
case (token.MINUS) {
262+
auto e = parse_prefix_expr(p);
263+
ret @ast.expr_unary(ast.neg, e);
264+
}
265+
266+
case (token.STAR) {
267+
auto e = parse_prefix_expr(p);
268+
ret @ast.expr_unary(ast.deref, e);
269+
}
270+
271+
case (_) {
272+
ret parse_path_expr(p);
273+
}
274+
}
275+
}
276+
277+
case (token.AT) {
278+
p.bump();
279+
auto e = parse_prefix_expr(p);
280+
ret @ast.expr_unary(ast.box, e);
281+
}
282+
189283
case (_) {
190-
ret parse_bottom_expr(p);
284+
ret parse_path_expr(p);
285+
}
286+
}
287+
}
288+
289+
state fn parse_binops(parser p,
290+
(state fn(parser) -> @ast.expr) sub,
291+
vec[tup(token.binop, ast.binop)] ops)
292+
-> @ast.expr {
293+
auto e = sub(p);
294+
auto more = true;
295+
while (more) {
296+
more = false;
297+
auto t = p.peek();
298+
alt (t) {
299+
case (token.BINOP(?op)) {
300+
for (tup(token.binop, ast.binop) pair in ops) {
301+
if (pair._0 == op) {
302+
e = @ast.expr_binary(pair._1, e, sub(p));
303+
more = true;
304+
t = p.peek();
305+
}
306+
}
307+
}
308+
case (_) {
309+
}
310+
}
311+
}
312+
ret e;
313+
}
314+
315+
state fn parse_binary_exprs(parser p,
316+
(state fn(parser) -> @ast.expr) sub,
317+
vec[tup(token.token, ast.binop)] ops)
318+
-> @ast.expr {
319+
auto e = sub(p);
320+
auto more = true;
321+
while (more) {
322+
more = false;
323+
auto t = p.peek();
324+
for (tup(token.token, ast.binop) pair in ops) {
325+
if (pair._0 == t) {
326+
e = @ast.expr_binary(pair._1, e, sub(p));
327+
more = true;
328+
t = p.peek();
329+
}
191330
}
192331
}
332+
ret e;
333+
}
334+
335+
state fn parse_factor_expr(parser p) -> @ast.expr {
336+
auto sub = parse_prefix_expr;
337+
ret parse_binops(p, sub, vec(tup(token.STAR, ast.mul),
338+
tup(token.SLASH, ast.div),
339+
tup(token.PERCENT, ast.rem)));
340+
}
341+
342+
state fn parse_term_expr(parser p) -> @ast.expr {
343+
auto sub = parse_factor_expr;
344+
ret parse_binops(p, sub, vec(tup(token.PLUS, ast.add),
345+
tup(token.MINUS, ast.sub)));
346+
}
347+
348+
state fn parse_shift_expr(parser p) -> @ast.expr {
349+
auto sub = parse_term_expr;
350+
ret parse_binops(p, sub, vec(tup(token.LSL, ast.lsl),
351+
tup(token.LSR, ast.lsr),
352+
tup(token.ASR, ast.asr)));
353+
}
354+
355+
state fn parse_bitand_expr(parser p) -> @ast.expr {
356+
auto sub = parse_shift_expr;
357+
ret parse_binops(p, sub, vec(tup(token.AND, ast.bitand)));
358+
}
359+
360+
state fn parse_bitxor_expr(parser p) -> @ast.expr {
361+
auto sub = parse_bitand_expr;
362+
ret parse_binops(p, sub, vec(tup(token.CARET, ast.bitxor)));
363+
}
364+
365+
state fn parse_bitor_expr(parser p) -> @ast.expr {
366+
auto sub = parse_bitxor_expr;
367+
ret parse_binops(p, sub, vec(tup(token.OR, ast.bitor)));
368+
}
369+
370+
state fn parse_cast_expr(parser p) -> @ast.expr {
371+
auto e = parse_bitor_expr(p);
372+
while (true) {
373+
alt (p.peek()) {
374+
case (token.AS) {
375+
p.bump();
376+
auto t = parse_ty(p);
377+
e = @ast.expr_cast(e, t);
378+
}
379+
380+
case (_) {
381+
ret e;
382+
}
383+
}
384+
}
385+
ret e;
386+
}
387+
388+
state fn parse_relational_expr(parser p) -> @ast.expr {
389+
auto sub = parse_cast_expr;
390+
ret parse_binary_exprs(p, sub, vec(tup(token.LT, ast.lt),
391+
tup(token.LE, ast.le),
392+
tup(token.GE, ast.ge),
393+
tup(token.GT, ast.gt)));
394+
}
395+
396+
397+
state fn parse_equality_expr(parser p) -> @ast.expr {
398+
auto sub = parse_relational_expr;
399+
ret parse_binary_exprs(p, sub, vec(tup(token.EQEQ, ast.eq),
400+
tup(token.NE, ast.ne)));
401+
}
402+
403+
state fn parse_and_expr(parser p) -> @ast.expr {
404+
auto sub = parse_equality_expr;
405+
ret parse_binary_exprs(p, sub, vec(tup(token.ANDAND, ast.and)));
406+
}
407+
408+
state fn parse_or_expr(parser p) -> @ast.expr {
409+
auto sub = parse_and_expr;
410+
ret parse_binary_exprs(p, sub, vec(tup(token.OROR, ast.or)));
193411
}
194412

195413
state fn parse_expr(parser p) -> @ast.expr {
196-
ret parse_negation_expr(p);
414+
ret parse_or_expr(p);
197415
}
198416

199417
state fn parse_stmt(parser p) -> @ast.stmt {
@@ -221,7 +439,7 @@ state fn parse_block(parser p) -> ast.block {
221439
state fn parse_slot_ident_pair(parser p) ->
222440
rec(ast.slot slot, ast.ident ident) {
223441
auto s = parse_slot(p);
224-
auto i = parse_ident(p);
442+
auto i = parse_ident(p);
225443
ret rec(slot=s, ident=i);
226444
}
227445

0 commit comments

Comments
 (0)