1
Fork 0

Start building up the expression tower.

This commit is contained in:
Graydon Hoare 2010-09-27 18:25:02 -07:00
parent f5787ed80c
commit 5b4b035c7a
3 changed files with 92 additions and 20 deletions

View file

@ -9,14 +9,41 @@ type crate = rec(_mod module);
type block = vec[@stmt]; type block = vec[@stmt];
tag binop {
plus;
minus;
star;
slash;
percent;
caret;
bitand;
bitor;
lsl;
lsr;
asr;
eq;
lt;
le;
ne;
ge;
gt;
}
tag unop {
bitnot;
not;
neg;
deref;
cast(@ty);
}
tag stmt { tag stmt {
stmt_block(block); stmt_block(block);
stmt_decl(@decl); stmt_decl(@decl);
stmt_ret(option[@lval]); stmt_ret(option[@expr]);
stmt_log(@atom); stmt_log(@expr);
} }
tag decl { tag decl {
decl_local(ident, option[ty]); decl_local(ident, option[ty]);
decl_item(ident, @item); decl_item(ident, @item);
@ -25,15 +52,23 @@ tag decl {
tag lval { tag lval {
lval_ident(ident); lval_ident(ident);
lval_ext(@lval, ident); lval_ext(@lval, ident);
lval_idx(@lval, @atom); lval_idx(@lval, @expr);
} }
tag atom { tag expr {
atom_lit(@lit); expr_box(@expr);
atom_lval(@lval); expr_vec(vec[@expr]);
expr_tup(vec[@expr]);
expr_rec(vec[tup(ident,@expr)]);
expr_call(@expr, vec[@expr]);
expr_binary(binop, @expr, @expr);
expr_unary(unop, @expr);
expr_lit(@lit);
expr_lval(@lval);
} }
tag lit { tag lit {
lit_str(str);
lit_char(char); lit_char(char);
lit_int(int); lit_int(int);
lit_uint(uint); lit_uint(uint);

View file

@ -132,40 +132,77 @@ state fn parse_seq[T](token.token bra,
ret v; ret v;
} }
state fn parse_lit(parser p) -> ast.lit { state fn parse_lit(parser p) -> @ast.lit {
alt (p.peek()) { alt (p.peek()) {
case (token.LIT_INT(?i)) { case (token.LIT_INT(?i)) {
p.bump(); p.bump();
ret ast.lit_int(i); ret @ast.lit_int(i);
} }
case (token.LIT_UINT(?u)) { case (token.LIT_UINT(?u)) {
p.bump(); p.bump();
ret ast.lit_uint(u); ret @ast.lit_uint(u);
} }
case (token.LIT_CHAR(?c)) { case (token.LIT_CHAR(?c)) {
p.bump(); p.bump();
ret ast.lit_char(c); ret @ast.lit_char(c);
} }
case (token.LIT_BOOL(?b)) { case (token.LIT_BOOL(?b)) {
p.bump(); p.bump();
ret ast.lit_bool(b); ret @ast.lit_bool(b);
} }
} }
p.err("expected literal"); p.err("expected literal");
fail; fail;
} }
state fn parse_atom(parser p) -> ast.atom {
ret ast.atom_lit(@parse_lit(p));
state fn parse_bottom_expr(parser p) -> @ast.expr {
alt (p.peek()) {
case (token.LPAREN) {
p.bump();
auto e = parse_expr(p);
expect(p, token.RPAREN);
ret e;
}
case (_) {
ret @ast.expr_lit(parse_lit(p));
}
}
}
state fn parse_negation_expr(parser p) -> @ast.expr {
alt (p.peek()) {
case (token.NOT) {
auto e = parse_negation_expr(p);
ret @ast.expr_unary(ast.not, e);
}
case (token.TILDE) {
auto e = parse_negation_expr(p);
ret @ast.expr_unary(ast.bitnot, e);
}
case (_) {
ret parse_bottom_expr(p);
}
}
}
state fn parse_expr(parser p) -> @ast.expr {
ret parse_negation_expr(p);
} }
state fn parse_stmt(parser p) -> @ast.stmt { state fn parse_stmt(parser p) -> @ast.stmt {
alt (p.peek()) { alt (p.peek()) {
case (token.LOG) { case (token.LOG) {
p.bump(); p.bump();
auto a = @parse_atom(p); auto e = parse_expr(p);
expect(p, token.SEMI); expect(p, token.SEMI);
ret @ast.stmt_log(a); ret @ast.stmt_log(e);
} }
} }
p.err("expected statement"); p.err("expected statement");

View file

@ -202,9 +202,9 @@ fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> ValueRef {
ret cx.build.Call(llglue, call_args); ret cx.build.Call(llglue, call_args);
} }
fn trans_log(@block_ctxt cx, &ast.atom a) { fn trans_log(@block_ctxt cx, &ast.expr e) {
alt (a) { alt (e) {
case (ast.atom_lit(?lit)) { case (ast.expr_lit(?lit)) {
alt (*lit) { alt (*lit) {
case (ast.lit_int(?i)) { case (ast.lit_int(?i)) {
trans_upcall(cx, "upcall_log_int", vec(C_int(i))); trans_upcall(cx, "upcall_log_int", vec(C_int(i)));
@ -215,7 +215,7 @@ fn trans_log(@block_ctxt cx, &ast.atom a) {
} }
} }
case (_) { case (_) {
cx.fcx.tcx.sess.unimpl("atom variant in trans_log"); cx.fcx.tcx.sess.unimpl("expr variant in trans_log");
} }
} }
} }