@@ -4,8 +4,9 @@ import diagnostic;
4
4
import ast:: { tt_delim, tt_flat} ;
5
5
6
6
export reader, string_reader, new_string_reader, is_whitespace;
7
+ export tt_reader, new_tt_reader;
7
8
export nextch, is_eof, bump, get_str_from;
8
- export string_reader_as_reader;
9
+ export string_reader_as_reader, tt_reader_as_reader ;
9
10
10
11
iface reader {
11
12
fn is_eof( ) -> bool;
@@ -27,14 +28,27 @@ type tt_frame = @{
27
28
} ;
28
29
29
30
type tt_reader = @{
30
- mut cur : tt_frame ,
31
- interner : @interner:: interner < @str > ,
32
31
span_diagnostic : diagnostic:: span_handler ,
32
+ interner : @interner:: interner < @str > ,
33
+ mut cur : tt_frame ,
33
34
/* cached: */
34
35
mut cur_tok : token:: token ,
35
36
mut cur_chpos : uint
36
37
} ;
37
38
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 : 0 u,
44
+ up : tt_frame_up ( option:: none) } ,
45
+ mut cur_tok: token:: EOF , /* dummy value, never read */
46
+ mut cur_chpos: 0 u /* dummy value, never read */
47
+ } ;
48
+ ( r as reader ) . next_token ( ) ; /* get cur_tok and cur_chpos set up */
49
+ ret r;
50
+ }
51
+
38
52
type string_reader = @{
39
53
span_diagnostic : diagnostic:: span_handler ,
40
54
src : @str ,
@@ -46,6 +60,21 @@ type string_reader = @{
46
60
interner : @interner:: interner < @str >
47
61
} ;
48
62
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: 0 u, mut pos: 0 u, 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
+
49
78
impl string_reader_as_reader of reader for string_reader {
50
79
fn is_eof ( ) -> bool { is_eof ( self ) }
51
80
fn next_token ( ) -> { tok : token:: token , chpos : uint } {
@@ -70,7 +99,6 @@ impl tt_reader_as_reader of reader for tt_reader {
70
99
fn is_eof ( ) -> bool { self . cur_tok == token:: EOF }
71
100
fn next_token ( ) -> { tok : token:: token , chpos : uint } {
72
101
let ret_val = { tok: self . cur_tok , chpos: self . cur_chpos } ;
73
- self . cur . idx += 1 u;
74
102
if self . cur . idx >= vec:: len ( self . cur . readme ) {
75
103
/* done with this set; pop */
76
104
alt self . cur . up {
@@ -97,6 +125,7 @@ impl tt_reader_as_reader of reader for tt_reader {
97
125
}
98
126
tt_flat ( chpos, tok) {
99
127
self . cur_chpos = chpos; self . cur_tok = tok;
128
+ self . cur . idx += 1 u;
100
129
ret ret_val;
101
130
}
102
131
}
@@ -144,21 +173,6 @@ fn nextch(rdr: string_reader) -> char {
144
173
} else { ret -1 as char ; }
145
174
}
146
175
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: 0 u, mut pos: 0 u, 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
-
162
176
fn dec_digit_val ( c : char ) -> int { ret ( c as int ) - ( '0' as int ) ; }
163
177
164
178
fn hex_digit_val ( c : char ) -> int {
0 commit comments