Start building up the expression tower.
This commit is contained in:
parent
f5787ed80c
commit
5b4b035c7a
3 changed files with 92 additions and 20 deletions
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue