Skip to content

Commit 047e3c4

Browse files
committed
Lexers now emit spans, not chposes.
1 parent d6522ab commit 047e3c4

File tree

5 files changed

+62
-48
lines changed

5 files changed

+62
-48
lines changed

src/libsyntax/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ enum blk_sort {
377377
enum token_tree {
378378
/* for macro invocations; parsing is the macro's job */
379379
tt_delim([token_tree]),
380-
tt_flat(uint, token::token)
380+
tt_flat(span, token::token)
381381
}
382382

383383
#[auto_serialize]

src/libsyntax/parse/comments.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import io::reader_util;
22
import io::println;//XXXXXXXXxxx
33
import util::interner;
4-
import lexer::{ string_reader, bump, is_eof, nextch, new_string_reader,
4+
import lexer::{ string_reader, bump, is_eof, nextch,
55
is_whitespace, get_str_from, string_reader_as_reader };
66

77
export cmnt;
@@ -176,8 +176,9 @@ fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler,
176176
{|x|str::hash(*x)},
177177
{|x,y|str::eq(*x, *y)}
178178
);
179-
let rdr = new_string_reader(span_diagnostic,
180-
codemap::new_filemap(path, src, 0u, 0u), itr);
179+
let rdr = lexer::new_low_level_string_reader
180+
(span_diagnostic, codemap::new_filemap(path, src, 0u, 0u), itr);
181+
181182
let mut comments: [cmnt] = [];
182183
let mut literals: [lit] = [];
183184
let mut first_read: bool = true;
@@ -195,14 +196,17 @@ fn gather_comments_and_literals(span_diagnostic: diagnostic::span_handler,
195196
}
196197
break;
197198
}
198-
let bpos = rdr.pos;
199-
let tok = rdr.next_token();
200-
if token::is_lit(tok.tok) {
201-
let s = get_str_from(rdr, bpos);
202-
literals += [{lit: s, pos: tok.chpos}];
199+
200+
201+
let bstart = rdr.pos;
202+
//discard, and look ahead; we're working with internal state
203+
let {tok: tok, sp: sp} = rdr.next_token();
204+
if token::is_lit(tok) {
205+
let s = get_str_from(rdr, bstart);
206+
literals += [{lit: s, pos: sp.lo}];
203207
log(debug, "tok lit: " + s);
204208
} else {
205-
log(debug, "tok: " + token::to_str(*rdr.interner, tok.tok));
209+
log(debug, "tok: " + token::to_str(*rdr.interner, tok));
206210
}
207211
first_read = false;
208212
}

src/libsyntax/parse/eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ fn parse_companion_mod(cx: ctx, prefix: str, suffix: option<str>)
6868
modpath, SOURCE_FILE);
6969
let inner_attrs = p0.parse_inner_attrs_and_next();
7070
let m0 = p0.parse_mod_items(token::EOF, inner_attrs.next);
71-
cx.sess.chpos = p0.reader.chpos();
71+
cx.sess.chpos = r0.chpos;
7272
cx.sess.byte_pos = cx.sess.byte_pos + r0.pos;
7373
ret (m0.view_items, m0.items, inner_attrs.inner);
7474
} else {
@@ -106,7 +106,7 @@ fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: str,
106106
/* FIXME: bad */ copy id,
107107
ast::item_mod(m0), ast::public, mod_attrs);
108108
// Thread defids, chpos and byte_pos through the parsers
109-
cx.sess.chpos = p0.reader.chpos();
109+
cx.sess.chpos = r0.chpos;
110110
cx.sess.byte_pos = cx.sess.byte_pos + r0.pos;
111111
items += [i];
112112
}

src/libsyntax/parse/lexer.rs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import util::interner;
22
import util::interner::intern;
33
import diagnostic;
44
import ast::{tt_delim,tt_flat};
5+
import codemap::span;
56

67
export reader, string_reader, new_string_reader, is_whitespace;
78
export tt_reader, new_tt_reader, dup_tt_reader;
8-
export nextch, is_eof, bump, get_str_from;
9+
export nextch, is_eof, bump, get_str_from, new_low_level_string_reader;
910
export string_reader_as_reader, tt_reader_as_reader;
1011

1112
iface reader {
1213
fn is_eof() -> bool;
13-
fn next_token() -> {tok: token::token, chpos: uint};
14+
fn next_token() -> {tok: token::token, sp: span};
1415
fn fatal(str) -> !;
15-
fn chpos() -> uint;
1616
fn interner() -> @interner::interner<@str>;
1717
}
1818

@@ -33,7 +33,7 @@ type tt_reader = ~{
3333
mut cur: tt_frame,
3434
/* cached: */
3535
mut cur_tok: token::token,
36-
mut cur_chpos: uint
36+
mut cur_span: span
3737
};
3838

3939
fn new_tt_reader(span_diagnostic: diagnostic::span_handler,
@@ -42,10 +42,11 @@ fn new_tt_reader(span_diagnostic: diagnostic::span_handler,
4242
let r = ~{span_diagnostic: span_diagnostic, interner: itr,
4343
mut cur: @{readme: src, mut idx: 0u,
4444
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 */
45+
/* dummy values, never read: */
46+
mut cur_tok: token::EOF,
47+
mut cur_span: ast_util::mk_sp(0u,0u)
4748
};
48-
tt_next_token(r); /* get cur_tok and cur_chpos set up */
49+
tt_next_token(r); /* get cur_tok and cur_span set up */
4950
ret r;
5051
}
5152

@@ -63,7 +64,7 @@ pure fn dup_tt_frame(&&f: tt_frame) -> tt_frame {
6364
pure fn dup_tt_reader(&&r: tt_reader) -> tt_reader {
6465
~{span_diagnostic: r.span_diagnostic, interner: r.interner,
6566
mut cur: dup_tt_frame(r.cur),
66-
mut cur_tok: r.cur_tok, mut cur_chpos: r.cur_chpos}
67+
mut cur_tok: r.cur_tok, mut cur_span: r.cur_span}
6768
}
6869

6970
type string_reader = @{
@@ -80,6 +81,15 @@ type string_reader = @{
8081
fn new_string_reader(span_diagnostic: diagnostic::span_handler,
8182
filemap: codemap::filemap,
8283
itr: @interner::interner<@str>) -> string_reader {
84+
let r = new_low_level_string_reader(span_diagnostic, filemap, itr);
85+
ret r;
86+
}
87+
88+
/* For comments.rs, which hackily pokes into 'pos' and 'curr' */
89+
fn new_low_level_string_reader(span_diagnostic: diagnostic::span_handler,
90+
filemap: codemap::filemap,
91+
itr: @interner::interner<@str>)
92+
-> string_reader {
8393
let r = @{span_diagnostic: span_diagnostic, src: filemap.src,
8494
mut col: 0u, mut pos: 0u, mut curr: -1 as char,
8595
mut chpos: filemap.start_pos.ch,
@@ -94,27 +104,26 @@ fn new_string_reader(span_diagnostic: diagnostic::span_handler,
94104

95105
impl string_reader_as_reader of reader for string_reader {
96106
fn is_eof() -> bool { is_eof(self) }
97-
fn next_token() -> {tok: token::token, chpos: uint} {
107+
fn next_token() -> {tok: token::token, sp: span} {
98108
consume_whitespace_and_comments(self);
99109
let start_chpos = self.chpos;
100110
let tok = if is_eof(self) {
101111
token::EOF
102112
} else {
103113
next_token_inner(self)
104114
};
105-
ret {tok: tok, chpos: start_chpos};
115+
ret {tok: tok, sp: ast_util::mk_sp(start_chpos, self.chpos)};
106116
}
107117
fn fatal(m: str) -> ! {
108118
self.span_diagnostic.span_fatal(
109119
ast_util::mk_sp(self.chpos, self.chpos), m)
110120
}
111-
fn chpos() -> uint { self.chpos }
112121
fn interner() -> @interner::interner<@str> { self.interner }
113122
}
114123

115124
impl tt_reader_as_reader of reader for tt_reader {
116125
fn is_eof() -> bool { self.cur_tok == token::EOF }
117-
fn next_token() -> {tok: token::token, chpos: uint} {
126+
fn next_token() -> {tok: token::token, sp: span} {
118127
/* weird resolve bug: if the following `if`, or any of its
119128
statements are removed, we get resolution errors */
120129
if false {
@@ -124,15 +133,19 @@ impl tt_reader_as_reader of reader for tt_reader {
124133
tt_next_token(self)
125134
}
126135
fn fatal(m: str) -> ! {
127-
self.span_diagnostic.span_fatal(
128-
ast_util::mk_sp(self.chpos(), self.chpos()), m);
136+
self.span_diagnostic.span_fatal(copy self.cur_span, m);
129137
}
130-
fn chpos() -> uint { self.cur_chpos }
131138
fn interner() -> @interner::interner<@str> { self.interner }
132139
}
133140

134-
fn tt_next_token(&&r: tt_reader) -> {tok: token::token, chpos: uint} {
135-
let ret_val = { tok: r.cur_tok, chpos: r.cur_chpos };
141+
fn string_advance_token(&&r: string_reader) {
142+
consume_whitespace_and_comments(r);
143+
144+
next_token_inner(r);
145+
}
146+
147+
fn tt_next_token(&&r: tt_reader) -> {tok: token::token, sp: span} {
148+
let ret_val = { tok: r.cur_tok, sp: r.cur_span };
136149
if r.cur.idx >= vec::len(r.cur.readme) {
137150
/* done with this set; pop */
138151
alt r.cur.up {
@@ -158,8 +171,8 @@ fn tt_next_token(&&r: tt_reader) -> {tok: token::token, chpos: uint} {
158171
r.cur = @{readme: tts, mut idx: 0u,
159172
up: tt_frame_up(option::some(copy r.cur)) };
160173
}
161-
tt_flat(chpos, tok) {
162-
r.cur_chpos = chpos; r.cur_tok = tok;
174+
tt_flat(sp, tok) {
175+
r.cur_span = sp; r.cur_tok = tok;
163176
r.cur.idx += 1u;
164177
ret ret_val;
165178
}

src/libsyntax/parse/parser.rs

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class parser {
6363
let mut token: token::token;
6464
let mut span: span;
6565
let mut last_span: span;
66-
let mut buffer: [mut {tok: token::token, span: span}]/4;
66+
let mut buffer: [mut {tok: token::token, sp: span}]/4;
6767
let mut buffer_start: int;
6868
let mut buffer_end: int;
6969
let mut restriction: restriction;
@@ -75,18 +75,18 @@ class parser {
7575
{
7676
self.reader <- rdr;
7777
let tok0 = self.reader.next_token();
78-
let span0 = ast_util::mk_sp(tok0.chpos, self.reader.chpos());
78+
let span0 = tok0.sp;
7979
self.sess = sess;
8080
self.cfg = cfg;
8181
self.file_type = ftype;
8282
self.token = tok0.tok;
8383
self.span = span0;
8484
self.last_span = span0;
8585
self.buffer = [mut
86-
{tok: tok0.tok, span: span0},
87-
{tok: tok0.tok, span: span0},
88-
{tok: tok0.tok, span: span0},
89-
{tok: tok0.tok, span: span0}
86+
{tok: tok0.tok, sp: span0},
87+
{tok: tok0.tok, sp: span0},
88+
{tok: tok0.tok, sp: span0},
89+
{tok: tok0.tok, sp: span0}
9090
]/4;
9191
self.buffer_start = 0;
9292
self.buffer_end = 0;
@@ -100,16 +100,15 @@ class parser {
100100

101101
fn bump() {
102102
self.last_span = self.span;
103-
if self.buffer_start == self.buffer_end {
104-
let next = self.reader.next_token();
105-
self.token = next.tok;
106-
self.span = mk_sp(next.chpos, self.reader.chpos());
103+
let next = if self.buffer_start == self.buffer_end {
104+
self.reader.next_token()
107105
} else {
108106
let next = self.buffer[self.buffer_start];
109107
self.buffer_start = (self.buffer_start + 1) & 3;
110-
self.token = next.tok;
111-
self.span = next.span;
112-
}
108+
next
109+
};
110+
self.token = next.tok;
111+
self.span = next.sp;
113112
}
114113
fn swap(next: token::token, lo: uint, hi: uint) {
115114
self.token = next;
@@ -124,9 +123,7 @@ class parser {
124123
fn look_ahead(distance: uint) -> token::token {
125124
let dist = distance as int;
126125
while self.buffer_length() < dist {
127-
let next = self.reader.next_token();
128-
let sp = mk_sp(next.chpos, self.reader.chpos());
129-
self.buffer[self.buffer_end] = {tok: next.tok, span: sp};
126+
self.buffer[self.buffer_end] = self.reader.next_token();
130127
self.buffer_end = (self.buffer_end + 1) & 3;
131128
}
132129
ret copy self.buffer[(self.buffer_start + dist - 1) & 3].tok;
@@ -1082,7 +1079,7 @@ class parser {
10821079
}
10831080
_ { /* ok */ }
10841081
}
1085-
let res = tt_flat(p.span.lo, p.token);
1082+
let res = tt_flat(p.span, p.token);
10861083
p.bump();
10871084
ret res;
10881085
}

0 commit comments

Comments
 (0)