about summary refs log tree commit diff
path: root/src/comp/syntax/parse
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-07-25 17:02:49 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-07-25 17:16:41 +0200
commitcce1b4667bb84497a350e746b65a7645c20de406 (patch)
tree0a90ff28e0146b7aae22ce7c5bc0ea30c75d956b /src/comp/syntax/parse
parentdca67f95cb98fa54192ba6a136c32d4fab51807b (diff)
Add look-ahead to parser object
Diffstat (limited to 'src/comp/syntax/parse')
-rw-r--r--src/comp/syntax/parse/parser.rs82
1 files changed, 48 insertions, 34 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 5e2e89a3dce..8156dfbda41 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -34,26 +34,28 @@ fn next_node_id(&parse_sess sess) -> node_id {
 
 type parser =
     obj {
-        fn peek() -> token::token ;
-        fn bump() ;
-        fn fatal(str) -> !  ;
+        fn peek() -> token::token;
+        fn bump();
+        fn look_ahead(uint) -> token::token;
+        fn fatal(str) -> !;
         fn warn(str);
-        fn restrict(restriction) ;
-        fn get_restriction() -> restriction ;
-        fn get_file_type() -> file_type ;
+        fn restrict(restriction);
+        fn get_restriction() -> restriction;
+        fn get_file_type() -> file_type;
         fn get_cfg() -> ast::crate_cfg;
-        fn get_span() -> span ;
-        fn get_lo_pos() -> uint ;
-        fn get_hi_pos() -> uint ;
-        fn get_last_lo_pos() -> uint ;
-        fn get_prec_table() -> @op_spec[] ;
-        fn get_str(token::str_num) -> str ;
-        fn get_reader() -> lexer::reader ;
-        fn get_filemap() -> codemap::filemap ;
-        fn get_bad_expr_words() -> hashmap[str, ()] ;
-        fn get_chpos() -> uint ;
-        fn get_byte_pos() -> uint ;
-        fn get_id() -> node_id ;
+        fn get_span() -> span;
+        fn get_lo_pos() -> uint;
+        fn get_hi_pos() -> uint;
+        fn get_last_lo_pos() -> uint;
+        fn get_last_hi_pos() -> uint;
+        fn get_prec_table() -> @op_spec[];
+        fn get_str(token::str_num) -> str;
+        fn get_reader() -> lexer::reader;
+        fn get_filemap() -> codemap::filemap;
+        fn get_bad_expr_words() -> hashmap[str, ()];
+        fn get_chpos() -> uint;
+        fn get_byte_pos() -> uint;
+        fn get_id() -> node_id;
         fn get_sess() -> parse_sess;
     };
 
@@ -77,23 +79,33 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
                      ast::crate_cfg cfg,
                      file_type ftype,
                      mutable token::token tok,
-                     mutable uint lo,
-                     mutable uint hi,
-                     mutable uint last_lo,
+                     mutable span tok_span,
+                     mutable span last_tok_span,
+                     mutable tup(token::token, span)[] buffer,
                      mutable restriction restr,
                      lexer::reader rdr,
                      @op_spec[] precs,
                      hashmap[str, ()] bad_words) {
         fn peek() -> token::token { ret tok; }
         fn bump() {
-            // log rdr.get_filename()
-            //   + ":" + common::istr(lo.line as int);
-
-            last_lo = lo;
-            auto next = lexer::next_token(rdr);
-            tok = next._0;
-            lo = next._1;
-            hi = rdr.get_chpos();
+            last_tok_span = tok_span;
+            if ivec::len(buffer) == 0u {
+                auto next = lexer::next_token(rdr);
+                tok = next._0;
+                tok_span = rec(lo=next._1, 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) -> ! {
             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 get_restriction() -> restriction { ret restr; }
-        fn get_span() -> span { ret rec(lo=lo, hi=hi); }
-        fn get_lo_pos() -> uint { ret lo; }
-        fn get_hi_pos() -> uint { ret hi; }
-        fn get_last_lo_pos() -> uint { ret last_lo; }
+        fn get_span() -> span { ret tok_span; }
+        fn get_lo_pos() -> uint { ret tok_span.lo; }
+        fn get_hi_pos() -> uint { ret tok_span.hi; }
+        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_cfg() -> ast::crate_cfg { ret cfg; }
         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 span0 = rec(lo=tok0._1, hi=rdr.get_chpos());
     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());
 }