Skip to content

Commit 11ffdc6

Browse files
committed
---
yaml --- r: 13512 b: refs/heads/master c: 85ded92 h: refs/heads/master v: v3
1 parent 55a4083 commit 11ffdc6

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: d619e8995f70556d58e57a699ba726c17f9e48ad
2+
refs/heads/master: 85ded92736290073b6c591c2607ee3d829cb2874
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/libsyntax/parse.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import attr::parser_attr;
1818
import common::parser_common;
1919
import ast::node_id;
2020
import util::interner;
21-
import lexer::{string_reader_as_reader, reader, string_reader};
21+
import lexer::{string_reader_as_reader, tt_reader_as_reader,
22+
reader, string_reader, tt_reader};
2223

2324
type parse_sess = @{
2425
cm: codemap::codemap,
@@ -178,3 +179,10 @@ fn new_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, +path: str,
178179
let (p, _) = new_parser_etc_from_file(sess, cfg, path, ftype);
179180
ret p;
180181
}
182+
183+
fn new_parser_from_tt(sess: parse_sess, cfg: ast::crate_cfg,
184+
itr: @interner::interner<@str>, tt: ast::token_tree)
185+
-> parser {
186+
let trdr = lexer::new_tt_reader(sess.span_diagnostic, itr, tt);
187+
ret parser(sess, cfg, trdr as reader, parser::SOURCE_FILE)
188+
}

trunk/src/libsyntax/parse/lexer.rs

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import diagnostic;
44
import ast::{tt_delim,tt_flat};
55

66
export reader, string_reader, new_string_reader, is_whitespace;
7+
export tt_reader, new_tt_reader;
78
export nextch, is_eof, bump, get_str_from;
8-
export string_reader_as_reader;
9+
export string_reader_as_reader, tt_reader_as_reader;
910

1011
iface reader {
1112
fn is_eof() -> bool;
@@ -27,14 +28,27 @@ type tt_frame = @{
2728
};
2829

2930
type tt_reader = @{
30-
mut cur: tt_frame,
31-
interner: @interner::interner<@str>,
3231
span_diagnostic: diagnostic::span_handler,
32+
interner: @interner::interner<@str>,
33+
mut cur: tt_frame,
3334
/* cached: */
3435
mut cur_tok: token::token,
3536
mut cur_chpos: uint
3637
};
3738

39+
fn new_tt_reader(span_diagnostic: diagnostic::span_handler,
40+
itr: @interner::interner<@str>, src: ast::token_tree)
41+
-> tt_reader {
42+
let r = @{span_diagnostic: span_diagnostic, interner: itr,
43+
mut cur: @{readme: [src], mut idx: 0u,
44+
up: tt_frame_up(option::none)},
45+
mut cur_tok: token::EOF, /* dummy value, never read */
46+
mut cur_chpos: 0u /* dummy value, never read */
47+
};
48+
(r as reader).next_token(); /* get cur_tok and cur_chpos set up */
49+
ret r;
50+
}
51+
3852
type string_reader = @{
3953
span_diagnostic: diagnostic::span_handler,
4054
src: @str,
@@ -46,6 +60,21 @@ type string_reader = @{
4660
interner: @interner::interner<@str>
4761
};
4862

63+
fn new_string_reader(span_diagnostic: diagnostic::span_handler,
64+
filemap: codemap::filemap,
65+
itr: @interner::interner<@str>) -> string_reader {
66+
let r = @{span_diagnostic: span_diagnostic, src: filemap.src,
67+
mut col: 0u, mut pos: 0u, mut curr: -1 as char,
68+
mut chpos: filemap.start_pos.ch,
69+
filemap: filemap, interner: itr};
70+
if r.pos < (*filemap.src).len() {
71+
let next = str::char_range_at(*r.src, r.pos);
72+
r.pos = next.next;
73+
r.curr = next.ch;
74+
}
75+
ret r;
76+
}
77+
4978
impl string_reader_as_reader of reader for string_reader {
5079
fn is_eof() -> bool { is_eof(self) }
5180
fn next_token() -> {tok: token::token, chpos: uint} {
@@ -70,7 +99,6 @@ impl tt_reader_as_reader of reader for tt_reader {
7099
fn is_eof() -> bool { self.cur_tok == token::EOF }
71100
fn next_token() -> {tok: token::token, chpos: uint} {
72101
let ret_val = { tok: self.cur_tok, chpos: self.cur_chpos };
73-
self.cur.idx += 1u;
74102
if self.cur.idx >= vec::len(self.cur.readme) {
75103
/* done with this set; pop */
76104
alt self.cur.up {
@@ -97,6 +125,7 @@ impl tt_reader_as_reader of reader for tt_reader {
97125
}
98126
tt_flat(chpos, tok) {
99127
self.cur_chpos = chpos; self.cur_tok = tok;
128+
self.cur.idx += 1u;
100129
ret ret_val;
101130
}
102131
}
@@ -144,21 +173,6 @@ fn nextch(rdr: string_reader) -> char {
144173
} else { ret -1 as char; }
145174
}
146175

147-
fn new_string_reader(span_diagnostic: diagnostic::span_handler,
148-
filemap: codemap::filemap,
149-
itr: @interner::interner<@str>) -> string_reader {
150-
let r = @{span_diagnostic: span_diagnostic, src: filemap.src,
151-
mut col: 0u, mut pos: 0u, mut curr: -1 as char,
152-
mut chpos: filemap.start_pos.ch,
153-
filemap: filemap, interner: itr};
154-
if r.pos < (*filemap.src).len() {
155-
let next = str::char_range_at(*r.src, r.pos);
156-
r.pos = next.next;
157-
r.curr = next.ch;
158-
}
159-
ret r;
160-
}
161-
162176
fn dec_digit_val(c: char) -> int { ret (c as int) - ('0' as int); }
163177

164178
fn hex_digit_val(c: char) -> int {

0 commit comments

Comments
 (0)