Skip to content

Commit 5b4b035

Browse files
committed
Start building up the expression tower.
1 parent f5787ed commit 5b4b035

File tree

3 files changed

+92
-20
lines changed

3 files changed

+92
-20
lines changed

src/comp/front/ast.rs

+42-7
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,41 @@ type crate = rec(_mod module);
99

1010
type block = vec[@stmt];
1111

12+
tag binop {
13+
plus;
14+
minus;
15+
star;
16+
slash;
17+
percent;
18+
caret;
19+
bitand;
20+
bitor;
21+
lsl;
22+
lsr;
23+
asr;
24+
eq;
25+
lt;
26+
le;
27+
ne;
28+
ge;
29+
gt;
30+
}
31+
32+
tag unop {
33+
bitnot;
34+
not;
35+
neg;
36+
deref;
37+
cast(@ty);
38+
}
39+
1240
tag stmt {
1341
stmt_block(block);
1442
stmt_decl(@decl);
15-
stmt_ret(option[@lval]);
16-
stmt_log(@atom);
43+
stmt_ret(option[@expr]);
44+
stmt_log(@expr);
1745
}
1846

19-
2047
tag decl {
2148
decl_local(ident, option[ty]);
2249
decl_item(ident, @item);
@@ -25,15 +52,23 @@ tag decl {
2552
tag lval {
2653
lval_ident(ident);
2754
lval_ext(@lval, ident);
28-
lval_idx(@lval, @atom);
55+
lval_idx(@lval, @expr);
2956
}
3057

31-
tag atom {
32-
atom_lit(@lit);
33-
atom_lval(@lval);
58+
tag expr {
59+
expr_box(@expr);
60+
expr_vec(vec[@expr]);
61+
expr_tup(vec[@expr]);
62+
expr_rec(vec[tup(ident,@expr)]);
63+
expr_call(@expr, vec[@expr]);
64+
expr_binary(binop, @expr, @expr);
65+
expr_unary(unop, @expr);
66+
expr_lit(@lit);
67+
expr_lval(@lval);
3468
}
3569

3670
tag lit {
71+
lit_str(str);
3772
lit_char(char);
3873
lit_int(int);
3974
lit_uint(uint);

src/comp/front/parser.rs

+46-9
Original file line numberDiff line numberDiff line change
@@ -132,40 +132,77 @@ state fn parse_seq[T](token.token bra,
132132
ret v;
133133
}
134134

135-
state fn parse_lit(parser p) -> ast.lit {
135+
state fn parse_lit(parser p) -> @ast.lit {
136136
alt (p.peek()) {
137137
case (token.LIT_INT(?i)) {
138138
p.bump();
139-
ret ast.lit_int(i);
139+
ret @ast.lit_int(i);
140140
}
141141
case (token.LIT_UINT(?u)) {
142142
p.bump();
143-
ret ast.lit_uint(u);
143+
ret @ast.lit_uint(u);
144144
}
145145
case (token.LIT_CHAR(?c)) {
146146
p.bump();
147-
ret ast.lit_char(c);
147+
ret @ast.lit_char(c);
148148
}
149149
case (token.LIT_BOOL(?b)) {
150150
p.bump();
151-
ret ast.lit_bool(b);
151+
ret @ast.lit_bool(b);
152152
}
153153
}
154154
p.err("expected literal");
155155
fail;
156156
}
157157

158-
state fn parse_atom(parser p) -> ast.atom {
159-
ret ast.atom_lit(@parse_lit(p));
158+
159+
160+
state fn parse_bottom_expr(parser p) -> @ast.expr {
161+
alt (p.peek()) {
162+
case (token.LPAREN) {
163+
p.bump();
164+
auto e = parse_expr(p);
165+
expect(p, token.RPAREN);
166+
ret e;
167+
}
168+
169+
case (_) {
170+
ret @ast.expr_lit(parse_lit(p));
171+
}
172+
}
173+
}
174+
175+
176+
state fn parse_negation_expr(parser p) -> @ast.expr {
177+
alt (p.peek()) {
178+
179+
case (token.NOT) {
180+
auto e = parse_negation_expr(p);
181+
ret @ast.expr_unary(ast.not, e);
182+
}
183+
184+
case (token.TILDE) {
185+
auto e = parse_negation_expr(p);
186+
ret @ast.expr_unary(ast.bitnot, e);
187+
}
188+
189+
case (_) {
190+
ret parse_bottom_expr(p);
191+
}
192+
}
193+
}
194+
195+
state fn parse_expr(parser p) -> @ast.expr {
196+
ret parse_negation_expr(p);
160197
}
161198

162199
state fn parse_stmt(parser p) -> @ast.stmt {
163200
alt (p.peek()) {
164201
case (token.LOG) {
165202
p.bump();
166-
auto a = @parse_atom(p);
203+
auto e = parse_expr(p);
167204
expect(p, token.SEMI);
168-
ret @ast.stmt_log(a);
205+
ret @ast.stmt_log(e);
169206
}
170207
}
171208
p.err("expected statement");

src/comp/middle/trans.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> ValueRef {
202202
ret cx.build.Call(llglue, call_args);
203203
}
204204

205-
fn trans_log(@block_ctxt cx, &ast.atom a) {
206-
alt (a) {
207-
case (ast.atom_lit(?lit)) {
205+
fn trans_log(@block_ctxt cx, &ast.expr e) {
206+
alt (e) {
207+
case (ast.expr_lit(?lit)) {
208208
alt (*lit) {
209209
case (ast.lit_int(?i)) {
210210
trans_upcall(cx, "upcall_log_int", vec(C_int(i)));
@@ -215,7 +215,7 @@ fn trans_log(@block_ctxt cx, &ast.atom a) {
215215
}
216216
}
217217
case (_) {
218-
cx.fcx.tcx.sess.unimpl("atom variant in trans_log");
218+
cx.fcx.tcx.sess.unimpl("expr variant in trans_log");
219219
}
220220
}
221221
}

0 commit comments

Comments
 (0)