Add look-ahead to parser object
This commit is contained in:
@@ -36,6 +36,7 @@ type parser =
|
|||||||
obj {
|
obj {
|
||||||
fn peek() -> token::token;
|
fn peek() -> token::token;
|
||||||
fn bump();
|
fn bump();
|
||||||
|
fn look_ahead(uint) -> token::token;
|
||||||
fn fatal(str) -> !;
|
fn fatal(str) -> !;
|
||||||
fn warn(str);
|
fn warn(str);
|
||||||
fn restrict(restriction);
|
fn restrict(restriction);
|
||||||
@@ -46,6 +47,7 @@ type parser =
|
|||||||
fn get_lo_pos() -> uint;
|
fn get_lo_pos() -> uint;
|
||||||
fn get_hi_pos() -> uint;
|
fn get_hi_pos() -> uint;
|
||||||
fn get_last_lo_pos() -> uint;
|
fn get_last_lo_pos() -> uint;
|
||||||
|
fn get_last_hi_pos() -> uint;
|
||||||
fn get_prec_table() -> @op_spec[];
|
fn get_prec_table() -> @op_spec[];
|
||||||
fn get_str(token::str_num) -> str;
|
fn get_str(token::str_num) -> str;
|
||||||
fn get_reader() -> lexer::reader;
|
fn get_reader() -> lexer::reader;
|
||||||
@@ -77,23 +79,33 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
|
|||||||
ast::crate_cfg cfg,
|
ast::crate_cfg cfg,
|
||||||
file_type ftype,
|
file_type ftype,
|
||||||
mutable token::token tok,
|
mutable token::token tok,
|
||||||
mutable uint lo,
|
mutable span tok_span,
|
||||||
mutable uint hi,
|
mutable span last_tok_span,
|
||||||
mutable uint last_lo,
|
mutable tup(token::token, span)[] buffer,
|
||||||
mutable restriction restr,
|
mutable restriction restr,
|
||||||
lexer::reader rdr,
|
lexer::reader rdr,
|
||||||
@op_spec[] precs,
|
@op_spec[] precs,
|
||||||
hashmap[str, ()] bad_words) {
|
hashmap[str, ()] bad_words) {
|
||||||
fn peek() -> token::token { ret tok; }
|
fn peek() -> token::token { ret tok; }
|
||||||
fn bump() {
|
fn bump() {
|
||||||
// log rdr.get_filename()
|
last_tok_span = tok_span;
|
||||||
// + ":" + common::istr(lo.line as int);
|
if ivec::len(buffer) == 0u {
|
||||||
|
|
||||||
last_lo = lo;
|
|
||||||
auto next = lexer::next_token(rdr);
|
auto next = lexer::next_token(rdr);
|
||||||
tok = next._0;
|
tok = next._0;
|
||||||
lo = next._1;
|
tok_span = rec(lo=next._1, hi=rdr.get_chpos());
|
||||||
hi = rdr.get_chpos();
|
} else {
|
||||||
|
auto next = ivec::pop(buffer);
|
||||||
|
tok = next._0;
|
||||||
|
tok_span = next._1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn look_ahead(uint distance) -> token::token {
|
||||||
|
while ivec::len(buffer) < distance {
|
||||||
|
auto next = lexer::next_token(rdr);
|
||||||
|
buffer =
|
||||||
|
~[tup(next._0, rec(lo=next._1, hi=rdr.get_chpos()))] + buffer;
|
||||||
|
}
|
||||||
|
ret buffer.(distance-1u)._0;
|
||||||
}
|
}
|
||||||
fn fatal(str m) -> ! {
|
fn fatal(str m) -> ! {
|
||||||
codemap::emit_error(some(self.get_span()), m, sess.cm);
|
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,
|
|||||||
}
|
}
|
||||||
fn restrict(restriction r) { restr = r; }
|
fn restrict(restriction r) { restr = r; }
|
||||||
fn get_restriction() -> restriction { ret restr; }
|
fn get_restriction() -> restriction { ret restr; }
|
||||||
fn get_span() -> span { ret rec(lo=lo, hi=hi); }
|
fn get_span() -> span { ret tok_span; }
|
||||||
fn get_lo_pos() -> uint { ret lo; }
|
fn get_lo_pos() -> uint { ret tok_span.lo; }
|
||||||
fn get_hi_pos() -> uint { ret hi; }
|
fn get_hi_pos() -> uint { ret tok_span.hi; }
|
||||||
fn get_last_lo_pos() -> uint { ret last_lo; }
|
fn get_last_lo_pos() -> uint { ret last_tok_span.lo; }
|
||||||
|
fn get_last_hi_pos() -> uint { ret last_tok_span.hi; }
|
||||||
fn get_file_type() -> file_type { ret ftype; }
|
fn get_file_type() -> file_type { ret ftype; }
|
||||||
fn get_cfg() -> ast::crate_cfg { ret cfg; }
|
fn get_cfg() -> ast::crate_cfg { ret cfg; }
|
||||||
fn get_prec_table() -> @op_spec[] { ret precs; }
|
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto tok0 = lexer::next_token(rdr);
|
auto tok0 = lexer::next_token(rdr);
|
||||||
|
auto span0 = rec(lo=tok0._1, hi=rdr.get_chpos());
|
||||||
ret stdio_parser(sess, cfg, ftype, tok0._0,
|
ret stdio_parser(sess, cfg, ftype, tok0._0,
|
||||||
tok0._1, tok0._1, tok0._1, UNRESTRICTED, rdr,
|
span0, span0, ~[], UNRESTRICTED, rdr,
|
||||||
prec_table(), bad_expr_word_table());
|
prec_table(), bad_expr_word_table());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user