about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-07-31 13:53:00 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-07-31 14:07:59 -0700
commit0bd6371155d187ce8d8ad5c0a45ea344804f6813 (patch)
treec288b2de08704257d34c5bc416e902ae6ffd830f /src/libsyntax/parse/parser.rs
parent8e7fb8e8f5c7175bb18e38c266de3ccce16189bb (diff)
downloadrust-0bd6371155d187ce8d8ad5c0a45ea344804f6813.tar.gz
rust-0bd6371155d187ce8d8ad5c0a45ea344804f6813.zip
Now you can use whatever delimiter you want to invoke syntax extensions.
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 17370628db9..b9e5fadeb81 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -883,9 +883,15 @@ class parser {
             /* `!`, as an operator, is prefix, so we know this isn't that */
             if self.token == token::NOT {
                 self.bump();
-                let tts = self.parse_unspanned_seq(
-                    token::LBRACE, token::RBRACE, seq_sep_none(),
-                    |p| p.parse_token_tree());
+                let tts = alt self.token {
+                  token::LPAREN | token::LBRACE | token::LBRACKET {
+                    let ket = token::flip_delimiter(self.token);
+                    self.parse_unspanned_seq(copy self.token, ket,
+                                             seq_sep_none(),
+                                             |p| p.parse_token_tree())
+                  }
+                  _ { self.fatal(~"expected open delimiter"); }
+                };
                 let hi = self.span.hi;
 
                 ret pexpr(self.mk_mac_expr(lo, hi, mac_invoc_tt(pth, tts)));
@@ -1083,16 +1089,6 @@ class parser {
     }
 
     fn parse_token_tree() -> token_tree {
-        /// what's the opposite delimiter?
-        fn flip(&t: token::token) -> token::token {
-            alt t {
-              token::LPAREN { token::RPAREN }
-              token::LBRACE { token::RBRACE }
-              token::LBRACKET { token::RBRACKET }
-              _ { fail }
-            }
-        }
-
         fn parse_tt_tok(p: parser, delim_ok: bool) -> token_tree {
             alt p.token {
               token::RPAREN | token::RBRACE | token::RBRACKET
@@ -1127,7 +1123,7 @@ class parser {
 
         ret alt self.token {
           token::LPAREN | token::LBRACE | token::LBRACKET {
-            let ket = flip(self.token);
+            let ket = token::flip_delimiter(self.token);
             tt_delim(vec::append(
                 ~[parse_tt_tok(self, true)],
                 vec::append(
@@ -2718,9 +2714,15 @@ class parser {
             let pth = self.parse_path_without_tps();
             self.expect(token::NOT);
             let id = self.parse_ident();
-            let tts = self.parse_unspanned_seq(token::LBRACE, token::RBRACE,
-                                               seq_sep_none(),
-                                               |p| p.parse_token_tree());
+            let tts = alt self.token {
+              token::LPAREN | token::LBRACE | token::LBRACKET {
+                let ket = token::flip_delimiter(self.token);
+                self.parse_unspanned_seq(copy self.token, ket,
+                                         seq_sep_none(),
+                                         |p| p.parse_token_tree())
+              }
+              _ { self.fatal(~"expected open delimiter"); }
+            };
             let m = ast::mac_invoc_tt(pth, tts);
             let m: ast::mac = {node: m,
                                span: {lo: self.span.lo,