8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use ast:: { TokenTree , TtDelimited , TtSequence , TtToken } ;
12
- use ast;
11
+ use ast:: { self , TokenTree , TtDelimited , TtSequence , TtToken } ;
13
12
use codemap:: { Span , DUMMY_SP } ;
14
13
use ext:: base:: { ExtCtxt , MacResult , SyntaxExtension } ;
15
14
use ext:: base:: { NormalTT , TTMacroExpander } ;
@@ -19,9 +18,8 @@ use ext::tt::macro_parser::{parse, parse_or_else};
19
18
use parse:: lexer:: { new_tt_reader, new_tt_reader_with_doc_flag} ;
20
19
use parse:: parser:: Parser ;
21
20
use parse:: attr:: ParserAttr ;
22
- use parse:: token:: { special_idents, gensym_ident, NtTT , Token } ;
21
+ use parse:: token:: { self , special_idents, gensym_ident, NtTT , Token } ;
23
22
use parse:: token:: Token :: * ;
24
- use parse:: token;
25
23
use print;
26
24
use ptr:: P ;
27
25
@@ -333,16 +331,20 @@ fn check_matcher<'a, I>(cx: &mut ExtCtxt, matcher: I, follow: &Token)
333
331
334
332
let tok = if let TtToken ( _, ref tok) = * token { tok } else { unreachable ! ( ) } ;
335
333
// If T' is in the set FOLLOW(NT), continue. Else, reject.
336
- match & next_token {
337
- & Eof => return Some ( ( sp, tok. clone ( ) ) ) ,
338
- _ if is_in_follow ( cx , & next_token , frag_spec . as_str ( ) ) => continue ,
339
- next => {
334
+ match ( & next_token, is_in_follow ( cx , & next_token , frag_spec . as_str ( ) ) ) {
335
+ ( & Eof , _ ) => return Some ( ( sp, tok. clone ( ) ) ) ,
336
+ ( _ , Ok ( true ) ) => continue ,
337
+ ( next, Ok ( false ) ) => {
340
338
cx. span_err ( sp, format ! ( "`${0}:{1}` is followed by `{2}`, which \
341
339
is not allowed for `{1}` fragments",
342
340
name. as_str( ) , frag_spec. as_str( ) ,
343
341
token_to_string( next) ) . as_slice ( ) ) ;
344
342
continue
345
343
} ,
344
+ ( _, Err ( msg) ) => {
345
+ cx. span_err ( sp, msg. as_slice ( ) ) ;
346
+ continue
347
+ }
346
348
}
347
349
} ,
348
350
TtSequence ( sp, ref seq) => {
@@ -409,12 +411,12 @@ fn check_matcher<'a, I>(cx: &mut ExtCtxt, matcher: I, follow: &Token)
409
411
last
410
412
}
411
413
412
- fn is_in_follow ( cx : & ExtCtxt , tok : & Token , frag : & str ) -> bool {
414
+ fn is_in_follow ( _ : & ExtCtxt , tok : & Token , frag : & str ) -> Result < bool , String > {
413
415
if let & CloseDelim ( _) = tok {
414
- return true ;
416
+ return Ok ( true ) ;
415
417
}
416
418
417
- match frag {
419
+ Ok ( match frag {
418
420
"item" => {
419
421
// since items *must* be followed by either a `;` or a `}`, we can
420
422
// accept anything after them
@@ -453,7 +455,6 @@ fn is_in_follow(cx: &ExtCtxt, tok: &Token, frag: &str) -> bool {
453
455
// harmless
454
456
true
455
457
} ,
456
- _ => cx. bug ( format ! ( "unrecognized builtin nonterminal {}" ,
457
- frag) . as_slice ( ) ) ,
458
- }
458
+ _ => return Err ( format ! ( "unrecognized builtin nonterminal `{}`" , frag) ) ,
459
+ } )
459
460
}
0 commit comments