@@ -34,26 +34,28 @@ fn next_node_id(&parse_sess sess) -> node_id {
34
34
35
35
type parser =
36
36
obj {
37
- fn peek ( ) -> token:: token ;
38
- fn bump ( ) ;
39
- fn fatal ( str ) -> ! ;
37
+ fn peek ( ) -> token:: token ;
38
+ fn bump ( ) ;
39
+ fn look_ahead ( uint ) -> token:: token ;
40
+ fn fatal ( str ) -> !;
40
41
fn warn ( str ) ;
41
- fn restrict ( restriction ) ;
42
- fn get_restriction ( ) -> restriction ;
43
- fn get_file_type ( ) -> file_type ;
42
+ fn restrict ( restriction ) ;
43
+ fn get_restriction ( ) -> restriction ;
44
+ fn get_file_type ( ) -> file_type ;
44
45
fn get_cfg ( ) -> ast:: crate_cfg ;
45
- fn get_span ( ) -> span ;
46
- fn get_lo_pos ( ) -> uint ;
47
- fn get_hi_pos ( ) -> uint ;
48
- fn get_last_lo_pos ( ) -> uint ;
49
- fn get_prec_table ( ) -> @op_spec [ ] ;
50
- fn get_str ( token:: str_num ) -> str ;
51
- fn get_reader ( ) -> lexer:: reader ;
52
- fn get_filemap ( ) -> codemap:: filemap ;
53
- fn get_bad_expr_words ( ) -> hashmap [ str, ( ) ] ;
54
- fn get_chpos ( ) -> uint ;
55
- fn get_byte_pos ( ) -> uint ;
56
- fn get_id ( ) -> node_id ;
46
+ fn get_span ( ) -> span ;
47
+ fn get_lo_pos ( ) -> uint ;
48
+ fn get_hi_pos ( ) -> uint ;
49
+ fn get_last_lo_pos ( ) -> uint ;
50
+ fn get_last_hi_pos ( ) -> uint ;
51
+ fn get_prec_table ( ) -> @op_spec [ ] ;
52
+ fn get_str ( token:: str_num ) -> str ;
53
+ fn get_reader ( ) -> lexer:: reader ;
54
+ fn get_filemap ( ) -> codemap:: filemap ;
55
+ fn get_bad_expr_words ( ) -> hashmap [ str, ( ) ] ;
56
+ fn get_chpos ( ) -> uint ;
57
+ fn get_byte_pos ( ) -> uint ;
58
+ fn get_id ( ) -> node_id ;
57
59
fn get_sess ( ) -> parse_sess ;
58
60
} ;
59
61
@@ -77,23 +79,33 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
77
79
ast:: crate_cfg cfg,
78
80
file_type ftype,
79
81
mutable token:: token tok,
80
- mutable uint lo ,
81
- mutable uint hi ,
82
- mutable uint last_lo ,
82
+ mutable span tok_span ,
83
+ mutable span last_tok_span ,
84
+ mutable tup ( token :: token , span ) [ ] buffer ,
83
85
mutable restriction restr,
84
86
lexer:: reader rdr,
85
87
@op_spec[ ] precs,
86
88
hashmap[ str, ( ) ] bad_words) {
87
89
fn peek ( ) -> token:: token { ret tok; }
88
90
fn bump ( ) {
89
- // log rdr.get_filename()
90
- // + ":" + common::istr(lo.line as int);
91
-
92
- last_lo = lo;
93
- auto next = lexer:: next_token ( rdr) ;
94
- tok = next. _0 ;
95
- lo = next. _1 ;
96
- hi = rdr. get_chpos ( ) ;
91
+ last_tok_span = tok_span;
92
+ if ivec:: len ( buffer) == 0 u {
93
+ auto next = lexer:: next_token ( rdr) ;
94
+ tok = next. _0 ;
95
+ tok_span = rec ( lo=next. _1 , hi=rdr. get_chpos ( ) ) ;
96
+ } else {
97
+ auto next = ivec:: pop ( buffer) ;
98
+ tok = next. _0 ;
99
+ tok_span = next. _1 ;
100
+ }
101
+ }
102
+ fn look_ahead ( uint distance ) -> token:: token {
103
+ while ivec:: len ( buffer) < distance {
104
+ auto next = lexer:: next_token ( rdr) ;
105
+ buffer =
106
+ ~[ tup ( next. _0 , rec ( lo=next. _1 , hi=rdr. get_chpos ( ) ) ) ] + buffer;
107
+ }
108
+ ret buffer. ( distance -1 u) . _0 ;
97
109
}
98
110
fn fatal ( str m) -> ! {
99
111
codemap:: emit_error ( some ( self . get_span ( ) ) , m, sess. cm ) ;
@@ -104,10 +116,11 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
104
116
}
105
117
fn restrict ( restriction r) { restr = r; }
106
118
fn get_restriction ( ) -> restriction { ret restr; }
107
- fn get_span ( ) -> span { ret rec ( lo=lo, hi=hi) ; }
108
- fn get_lo_pos ( ) -> uint { ret lo; }
109
- fn get_hi_pos ( ) -> uint { ret hi; }
110
- fn get_last_lo_pos ( ) -> uint { ret last_lo; }
119
+ fn get_span ( ) -> span { ret tok_span; }
120
+ fn get_lo_pos ( ) -> uint { ret tok_span. lo ; }
121
+ fn get_hi_pos ( ) -> uint { ret tok_span. hi ; }
122
+ fn get_last_lo_pos ( ) -> uint { ret last_tok_span. lo ; }
123
+ fn get_last_hi_pos ( ) -> uint { ret last_tok_span. hi ; }
111
124
fn get_file_type ( ) -> file_type { ret ftype; }
112
125
fn get_cfg ( ) -> ast:: crate_cfg { ret cfg; }
113
126
fn get_prec_table ( ) -> @op_spec [ ] { ret precs; }
@@ -124,8 +137,9 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
124
137
}
125
138
126
139
auto tok0 = lexer:: next_token ( rdr) ;
140
+ auto span0 = rec ( lo=tok0. _1 , hi=rdr. get_chpos ( ) ) ;
127
141
ret stdio_parser ( sess, cfg, ftype, tok0. _0 ,
128
- tok0 . _1 , tok0 . _1 , tok0 . _1 , UNRESTRICTED , rdr,
142
+ span0 , span0 , ~ [ ] , UNRESTRICTED , rdr,
129
143
prec_table ( ) , bad_expr_word_table ( ) ) ;
130
144
}
131
145
0 commit comments