diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2012-06-27 15:29:35 -0700 |
|---|---|---|
| committer | Paul Stansifer <paul.stansifer@gmail.com> | 2012-07-05 18:09:31 -0700 |
| commit | 39590d81f01b97da574de3298f664eeabf84d255 (patch) | |
| tree | 5601ee33036ef90887e2776fe9c6ba9fbcc4da56 /src/libsyntax/parse/parser.rs | |
| parent | 74c2266a06d3c1038491fa0aea32be52a47f598d (diff) | |
| download | rust-39590d81f01b97da574de3298f664eeabf84d255.tar.gz rust-39590d81f01b97da574de3298f664eeabf84d255.zip | |
Some rearranging in perparation for MBE-style TT transcription.
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 55e75f07f27..90c5b3f3720 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -70,6 +70,7 @@ class parser { let mut buffer_start: int; let mut buffer_end: int; let mut restriction: restriction; + let mut quote_depth: uint; // not (yet) related to the quasiquoter let reader: reader; let keywords: hashmap<str, ()>; let restricted_keywords: hashmap<str, ()>; @@ -94,6 +95,7 @@ class parser { self.buffer_start = 0; self.buffer_end = 0; self.restriction = UNRESTRICTED; + self.quote_depth = 0u; self.keywords = token::keyword_table(); self.restricted_keywords = token::restricted_keyword_table(); } @@ -1067,6 +1069,11 @@ class parser { } fn parse_tt_flat(p: parser, delim_ok: bool) -> token_tree { + if p.eat_keyword("many") && p.quote_depth > 0u { + ret tt_dotdotdot( + p.parse_seq(token::LPAREN, token::RPAREN, seq_sep_none(), + |p| p.parse_token_tree()).node); + } alt p.token { token::RPAREN | token::RBRACE | token::RBRACKET if !delim_ok { @@ -1076,6 +1083,11 @@ class parser { token::EOF { p.fatal("file ended in the middle of a macro invocation"); } + /* we ought to allow different depths of unquotation */ + token::DOLLAR if p.quote_depth > 0u { + p.bump(); + ret tt_interpolate(p.parse_ident()); + } _ { /* ok */ } } let res = tt_flat(p.span, p.token); @@ -1104,10 +1116,11 @@ class parser { common::seq_sep_none(), |p| p.parse_matcher(@mut 0u)).node; let tt = self.parse_token_tree(); + //let tt_rhs = self.parse_token_tree(); alt tt { tt_delim(tts) { let rdr = lexer::new_tt_reader(self.reader.span_diag(), - self.reader.interner(), tts) + self.reader.interner(), none, tts) as reader; ext::earley_parser::parse(self.sess, self.cfg, rdr, ms); } |
