@@ -34,26 +34,28 @@ fn next_node_id(&parse_sess sess) -> node_id {
3434
3535type parser =
3636 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 ) -> !;
4041 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 ;
4445 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 ;
5759 fn get_sess ( ) -> parse_sess ;
5860 } ;
5961
@@ -77,23 +79,33 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
7779 ast:: crate_cfg cfg,
7880 file_type ftype,
7981 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 ,
8385 mutable restriction restr,
8486 lexer:: reader rdr,
8587 @op_spec[ ] precs,
8688 hashmap[ str, ( ) ] bad_words) {
8789 fn peek ( ) -> token:: token { ret tok; }
8890 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 ;
97109 }
98110 fn fatal ( str m) -> ! {
99111 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,
104116 }
105117 fn restrict ( restriction r) { restr = r; }
106118 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 ; }
111124 fn get_file_type ( ) -> file_type { ret ftype; }
112125 fn get_cfg ( ) -> ast:: crate_cfg { ret cfg; }
113126 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,
124137 }
125138
126139 auto tok0 = lexer:: next_token ( rdr) ;
140+ auto span0 = rec ( lo=tok0. _1 , hi=rdr. get_chpos ( ) ) ;
127141 ret stdio_parser ( sess, cfg, ftype, tok0. _0 ,
128- tok0 . _1 , tok0 . _1 , tok0 . _1 , UNRESTRICTED , rdr,
142+ span0 , span0 , ~ [ ] , UNRESTRICTED , rdr,
129143 prec_table ( ) , bad_expr_word_table ( ) ) ;
130144}
131145
0 commit comments