diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2011-06-29 18:07:04 -0700 |
|---|---|---|
| committer | Paul Stansifer <paul.stansifer@gmail.com> | 2011-07-11 18:52:10 -0700 |
| commit | 80cf4ecd3bfe602004145e57cf7fdfb067b76ce1 (patch) | |
| tree | 7fe2ceabdf59e39be101924ee18d6afdefcd00b5 /src/comp/syntax | |
| parent | fd24fd5e318c5bfbe0cba49f0b49edd3c112f451 (diff) | |
| download | rust-80cf4ecd3bfe602004145e57cf7fdfb067b76ce1.tar.gz rust-80cf4ecd3bfe602004145e57cf7fdfb067b76ce1.zip | |
Add nodes for embedding types and blocks in expressions for macros.
Diffstat (limited to 'src/comp/syntax')
| -rw-r--r-- | src/comp/syntax/ast.rs | 1 | ||||
| -rw-r--r-- | src/comp/syntax/fold.rs | 22 | ||||
| -rw-r--r-- | src/comp/syntax/parse/lexer.rs | 26 | ||||
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 18 | ||||
| -rw-r--r-- | src/comp/syntax/parse/token.rs | 24 | ||||
| -rw-r--r-- | src/comp/syntax/visit.rs | 6 | ||||
| -rw-r--r-- | src/comp/syntax/walk.rs | 6 |
7 files changed, 58 insertions, 45 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index b0efc763537..26cefb3c0d6 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -323,7 +323,6 @@ tag expr_ { to expr_if_check. */ expr_if_check(@expr, block, option::t[@expr]); expr_port(option::t[@ty]); - expr_chan(@expr); expr_anon_obj(anon_obj, ty_param[]); } diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index e0774b68e30..659a527dbe2 100644 --- a/src/comp/syntax/fold.rs +++ b/src/comp/syntax/fold.rs @@ -445,6 +445,12 @@ fn noop_fold_expr(&expr_ e, ast_fold fld) -> expr_ { case (expr_anon_obj(?ao, ?typms)) { expr_anon_obj(fold_anon_obj(ao), typms) } + case (expr_embeded_type(?ty)) { + expr_embeded_type(fld.fold_ty(ty)) + } + case (expr_embeded_block(?blk)) { + expr_embeded_block(fld.fold_block(blk)) + } } } @@ -695,22 +701,6 @@ fn make_fold(&ast_fold_precursor afp) -> ast_fold { fold_path = bind f_path(afp,result,_), fold_local = bind f_local(afp,result,_)); ret result; - /* - ret rec(fold_crate = noop_fold_crate, - fold_crate_directive = noop_fold_crate_drective, - fold_view_item = noop_fold_view_item, - fold_native_item = noop_fold_native_item, - fold_item = noop_fold_item, - fold_method = noop_fold_method, - fold_block = noop_fold_block, - fold_stmt = noop_fold_stmt, - fold_arm = noop_fold_arm, - fold_pat = noop_fold_pat, - fold_decl = noop_fold_decl, - fold_expr = noop_fold_expr, - fold_ty = noop_fold_ty, - fold_constr = noop_fold_constr, - fold_fn = noop_fold_fn);*/ } diff --git a/src/comp/syntax/parse/lexer.rs b/src/comp/syntax/parse/lexer.rs index 64b04693d60..21b1b7ee634 100644 --- a/src/comp/syntax/parse/lexer.rs +++ b/src/comp/syntax/parse/lexer.rs @@ -361,12 +361,8 @@ fn next_token(&reader rdr) -> token::token { } else { ret token::BINOP(op); } } alt (c) { - case ( - // One-byte tokens. - '?') { - rdr.bump(); - ret token::QUES; - } + // One-byte tokens. + case ('?') { rdr.bump(); ret token::QUES; } case (';') { rdr.bump(); ret token::SEMI; } case (',') { rdr.bump(); ret token::COMMA; } case ('.') { rdr.bump(); ret token::DOT; } @@ -377,7 +373,18 @@ fn next_token(&reader rdr) -> token::token { case ('[') { rdr.bump(); ret token::LBRACKET; } case (']') { rdr.bump(); ret token::RBRACKET; } case ('@') { rdr.bump(); ret token::AT; } - case ('#') { rdr.bump(); ret token::POUND; } + case ('#') { + rdr.bump(); + if (rdr.curr() == '<') { + rdr.bump(); + ret token::POUND_LT; + } + if (rdr.curr() == '{') { + rdr.bump(); + ret token::POUND_LBRACE; + } + ret token::POUND; + } case ('~') { rdr.bump(); ret token::TILDE; } case (':') { rdr.bump(); @@ -386,9 +393,8 @@ fn next_token(&reader rdr) -> token::token { ret token::MOD_SEP; } else { ret token::COLON; } } - case ( - // Multi-byte tokens. - '=') { + // Multi-byte tokens. + case ('=') { rdr.bump(); if (rdr.curr() == '=') { rdr.bump(); diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 59b0884704c..7d6fc8561cc 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -804,6 +804,13 @@ fn parse_bottom_expr(&parser p) -> @ast::expr { parse_seq_to_end_ivec(token::RBRACKET, some(token::COMMA), parse_expr, p); ex = ast::expr_vec(es, mut, ast::sk_rc); + } else if (p.peek() == token::POUND_LT) { + p.bump(); + ex = ast::expr_embeded_type(parse_ty(p)); + expect(p, token::GT); + } else if (p.peek() == token::POUND_LBRACE) { + p.bump(); + ex = ast::expr_embeded_block(parse_block_tail(p)); } else if (p.peek() == token::TILDE) { p.bump(); alt (p.peek()) { @@ -1715,10 +1722,15 @@ fn stmt_ends_with_semi(&ast::stmt stmt) -> bool { } fn parse_block(&parser p) -> ast::block { + expect(p, token::LBRACE); + be parse_block_tail(p); +} + +// some blocks start with "#{"... +fn parse_block_tail(&parser p) -> ast::block { auto lo = p.get_lo_pos(); let (@ast::stmt)[] stmts = ~[]; let option::t[@ast::expr] expr = none; - expect(p, token::LBRACE); while (p.peek() != token::RBRACE) { alt (p.peek()) { case (token::SEMI) { @@ -2204,8 +2216,10 @@ fn parse_outer_attrs_or_ext(&parser p) -> attr_or_ext { if (p.peek() == token::LBRACKET) { auto first_attr = parse_attribute_naked(p, ast::attr_outer, lo); ret some(left(~[first_attr] + parse_outer_attributes(p))); - } else { + } else if (! (p.peek() == token::LT || p.peek() == token::LBRACKET)) { ret some(right(parse_syntax_ext_naked(p, lo))); + } else { + ret none; } } else { ret none; diff --git a/src/comp/syntax/parse/token.rs b/src/comp/syntax/parse/token.rs index 2ce5d9e6cb4..6ba8c6ce525 100644 --- a/src/comp/syntax/parse/token.rs +++ b/src/comp/syntax/parse/token.rs @@ -60,6 +60,8 @@ tag token { LBRACE; RBRACE; POUND; + POUND_LBRACE; + POUND_LT; /* Literals */ LIT_INT(int); @@ -110,11 +112,8 @@ fn to_str(lexer::reader r, token t) -> str { case (ANDAND) { ret "&&"; } case (BINOP(?op)) { ret binop_to_str(op); } case (BINOPEQ(?op)) { ret binop_to_str(op) + "="; } - case ( /* Structural symbols */ - AT) { - ret "@"; - } + case (AT) { ret "@"; } case (DOT) { ret "."; } case (COMMA) { ret ","; } case (SEMI) { ret ";"; } @@ -133,11 +132,10 @@ fn to_str(lexer::reader r, token t) -> str { case (LBRACE) { ret "{"; } case (RBRACE) { ret "}"; } case (POUND) { ret "#"; } - case ( + case (POUND_LBRACE) { ret "#{"; } + case (POUND_LT) { ret "#<"; } /* Literals */ - LIT_INT(?i)) { - ret int::to_str(i, 10u); - } + case (LIT_INT(?i)) { ret int::to_str(i, 10u); } case (LIT_UINT(?u)) { ret uint::to_str(u, 10u); } case (LIT_MACH_INT(?tm, ?i)) { ret int::to_str(i, 10u) + "_" + ty_mach_to_str(tm); @@ -147,25 +145,19 @@ fn to_str(lexer::reader r, token t) -> str { ty_mach_to_str(tm); } case (LIT_FLOAT(?s)) { ret interner::get[str](*r.get_interner(), s); } - case (LIT_STR(?s)) { - // FIXME: escape. - + case (LIT_STR(?s)) { // FIXME: escape. ret "\"" + interner::get[str](*r.get_interner(), s) + "\""; } case (LIT_CHAR(?c)) { // FIXME: escape. - auto tmp = "'"; str::push_char(tmp, c); str::push_byte(tmp, '\'' as u8); ret tmp; } case (LIT_BOOL(?b)) { if (b) { ret "true"; } else { ret "false"; } } - case ( /* Name components */ - IDENT(?s, _)) { - ret interner::get[str](*r.get_interner(), s); - } + case (IDENT(?s, _)) { ret interner::get[str](*r.get_interner(), s); } case (IDX(?i)) { ret "_" + int::to_str(i, 10u); } case (UNDERSCORE) { ret "_"; } case (BRACEQUOTE(_)) { ret "<bracequote>"; } diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs index 9ff8ccb0c11..71d44e29f80 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -397,6 +397,12 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) { m.node.id, e, v); } } + case (expr_embeded_type(?ty)) { + vt(v).visit_ty(ty, e, v); + } + case (expr_embeded_block(?blk)) { + vt(v).visit_block(blk, e, v); + } } } diff --git a/src/comp/syntax/walk.rs b/src/comp/syntax/walk.rs index 024437e4327..bc188b8c604 100644 --- a/src/comp/syntax/walk.rs +++ b/src/comp/syntax/walk.rs @@ -410,6 +410,12 @@ fn walk_expr(&ast_visitor v, @ast::expr e) { v.visit_method_post(m); } } + case (ast::expr_embeded_type(?ty)) { + walk_ty(v, ty); + } + case (ast::expr_embeded_block(?blk)) { + walk_block(v, blk); + } } v.visit_expr_post(e); } |
