Skip to content

Commit cce1b46

Browse files
committed
Add look-ahead to parser object
1 parent dca67f9 commit cce1b46

File tree

1 file changed

+48
-34
lines changed

1 file changed

+48
-34
lines changed

src/comp/syntax/parse/parser.rs

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,28 @@ fn next_node_id(&parse_sess sess) -> node_id {
3434

3535
type 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) == 0u {
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-1u)._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

Comments
 (0)