Skip to content

Commit 83d6bca

Browse files
committed
---
yaml --- r: 8035 b: refs/heads/snap-stage3 c: 67e961c h: refs/heads/master i: 8033: 4c75798 8031: 48e8077 v: v3
1 parent 815a368 commit 83d6bca

File tree

4 files changed

+94
-13
lines changed

4 files changed

+94
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 477714f08eec291bbcb8f41c5bf187ee5f016425
4+
refs/heads/snap-stage3: 67e961c17f4f30a73d1730ce6eed3cb1d34b5125
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/snap-stage3/src/comp/syntax/ext/qquote.rs

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,94 @@ import driver::session;
22

33
import option::{none, some};
44

5-
import syntax::ast::{crate, expr_, expr_mac, mac_invoc, mac_qq, mac_var};
5+
import syntax::ast::{crate, expr_, expr_mac, mac_invoc,
6+
mac_qq, mac_aq, mac_var};
67
import syntax::fold::*;
8+
import syntax::visit::*;
79
import syntax::ext::base::*;
810
import syntax::ext::build::*;
911
import syntax::parse::parser::parse_expr_from_source_str;
1012

13+
import syntax::print::*;
14+
import std::io::*;
15+
1116
import codemap::span;
1217

13-
fn expand_qquote(cx: ext_ctxt, sp: span, _e: @ast::expr) -> ast::expr_ {
14-
let str = codemap::span_to_snippet(sp, cx.session().parse_sess.cm);
18+
type aq_ctxt = @{lo: uint,
19+
mutable gather: [{lo: uint, hi: uint, e: @ast::expr}]};
20+
21+
fn gather_anti_quotes(lo: uint, e: @ast::expr) -> aq_ctxt
22+
{
23+
let v = @{visit_expr: visit_expr_aq
24+
with *default_visitor()};
25+
let cx = @{lo:lo, mutable gather: []};
26+
visit_expr_aq(e, cx, mk_vt(v));
27+
ret cx;
28+
}
29+
30+
fn visit_expr_aq(expr: @ast::expr, &&cx: aq_ctxt, v: vt<aq_ctxt>)
31+
{
32+
alt (expr.node) {
33+
expr_mac({node: mac_aq(sp, e), _}) {
34+
cx.gather += [{lo: sp.lo - cx.lo, hi: sp.hi - cx.lo,
35+
e: e}];
36+
}
37+
_ {visit_expr(expr, cx, v);}
38+
}
39+
}
40+
41+
fn expand_qquote(ecx: ext_ctxt, sp: span, e: @ast::expr) -> ast::expr_ {
42+
let str = codemap::span_to_snippet(sp, ecx.session().parse_sess.cm);
43+
let qcx = gather_anti_quotes(sp.lo, e);
44+
let cx = qcx;
45+
let prev = 0u;
46+
for {lo: lo, _} in cx.gather {
47+
assert lo > prev;
48+
prev = lo;
49+
}
50+
let str2 = "";
51+
let active = true;
52+
let i = 0u, j = 0u;
53+
let g_len = vec::len(cx.gather);
54+
str::chars_iter(str) {|ch|
55+
if (active && j < g_len && i == cx.gather[j].lo) {
56+
assert ch == '$';
57+
active = false;
58+
str2 += #fmt(" $%u ", j);
59+
}
60+
if (active) {str::push_char(str2, ch);}
61+
i += 1u;
62+
if (!active && j < g_len && i == cx.gather[j].hi) {
63+
assert ch == ')';
64+
active = true;
65+
j += 1u;
66+
}
67+
}
68+
69+
let cx = ecx;
1570
let session_call = bind mk_call_(cx,sp,
1671
mk_access(cx,sp,["ext_cx"], "session"),
1772
[]);
18-
let call = mk_call(cx,sp,
73+
let pcall = mk_call(cx,sp,
1974
["syntax", "parse", "parser",
2075
"parse_expr_from_source_str"],
2176
[mk_str(cx,sp, "<anon>"),
2277
mk_unary(cx,sp, ast::box(ast::imm),
23-
mk_str(cx,sp, str)),
78+
mk_str(cx,sp, str2)),
2479
mk_access_(cx,sp,
2580
mk_access_(cx,sp, session_call(), "opts"),
2681
"cfg"),
2782
mk_access_(cx,sp, session_call(), "parse_sess")]
2883
);
29-
ret call.node;
84+
let rcall = pcall;
85+
if (g_len > 0u) {
86+
rcall = mk_call(cx,sp,
87+
["syntax", "ext", "qquote", "replace"],
88+
[pcall,
89+
mk_vec_e(cx,sp, vec::map(qcx.gather, {|g| g.e}))]);
90+
}
91+
92+
ret rcall.node;
3093
}
3194

3295
fn replace(e: @ast::expr, repls: [@ast::expr]) -> @ast::expr {
@@ -43,14 +106,20 @@ fn replace_expr(repls: [@ast::expr],
43106
orig: fn@(ast::expr_, span, ast_fold)->(ast::expr_, span))
44107
-> (ast::expr_, span)
45108
{
46-
// note: nested enum matching will be really nice here so I can jusy say
47-
// expr_mac(mac_var(i))
48109
alt e {
49110
expr_mac({node: mac_var(i), _}) {let r = repls[i]; (r.node, r.span)}
50111
_ {orig(e,s,fld)}
51112
}
52113
}
53114

115+
fn print_expr(expr: @ast::expr) {
116+
let stdout = std::io::stdout();
117+
let pp = pprust::rust_printer(stdout);
118+
pprust::print_expr(pp, expr);
119+
pp::eof(pp.s);
120+
stdout.write_str("\n");
121+
}
122+
54123
// Local Variables:
55124
// mode: rust
56125
// fill-column: 78;

branches/snap-stage3/src/comp/syntax/parse/lexer.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,11 @@ fn next_token_inner(rdr: reader) -> token::token {
372372
}
373373
rdr.bump();
374374
ret token::DOLLAR_NUM(val);
375-
} else if c == '(' {
375+
} else if rdr.curr == '(' {
376+
rdr.bump();
376377
ret token::DOLLAR_LPAREN;
377378
} else {
378-
rdr.fatal("expected digit3");
379+
rdr.fatal("expected digit");
379380
}
380381
}
381382

branches/snap-stage3/src/comp/syntax/parse/parser.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,19 @@ fn parse_seq<T: copy>(bra: token::token, ket: token::token,
630630

631631
fn have_dollar(p: parser) -> option::t<ast::mac_> {
632632
alt p.token {
633-
token::DOLLAR_NUM(num) {p.bump(); some(ast::mac_var(num))}
634-
_ {none}
633+
token::DOLLAR_NUM(num) {
634+
p.bump();
635+
some(ast::mac_var(num))
636+
}
637+
token::DOLLAR_LPAREN {
638+
let lo = p.span.lo;
639+
p.bump();
640+
let e = parse_expr(p);
641+
expect(p, token::RPAREN);
642+
let hi = p.last_span.hi;
643+
some(ast::mac_aq(ast_util::mk_sp(lo,hi), e))
644+
}
645+
_ {none}
635646
}
636647
}
637648

0 commit comments

Comments
 (0)