@@ -83,7 +83,7 @@ use self::TokenTreeOrTokenTreeVec::*;
8383use ast;
8484use ast:: { TokenTree , Ident } ;
8585use ast:: { TtDelimited , TtSequence , TtToken } ;
86- use codemap:: { BytePos , mk_sp} ;
86+ use codemap:: { BytePos , mk_sp, Span } ;
8787use codemap;
8888use parse:: lexer:: * ; //resolve bug?
8989use parse:: ParseSess ;
@@ -483,11 +483,11 @@ pub fn parse(sess: &ParseSess,
483483
484484 let mut ei = bb_eis. pop ( ) . unwrap ( ) ;
485485 match ei. top_elts . get_tt ( ei. idx ) {
486- TtToken ( _ , MatchNt ( _, name, _, _) ) => {
486+ TtToken ( span , MatchNt ( _, name, _, _) ) => {
487487 let name_string = token:: get_ident ( name) ;
488488 let match_cur = ei. match_cur ;
489489 ( & mut ei. matches [ match_cur] ) . push ( Rc :: new ( MatchedNonterminal (
490- parse_nt ( & mut rust_parser, name_string. get ( ) ) ) ) ) ;
490+ parse_nt ( & mut rust_parser, span , name_string. get ( ) ) ) ) ) ;
491491 ei. idx += 1 us;
492492 ei. match_cur += 1 ;
493493 }
@@ -505,7 +505,7 @@ pub fn parse(sess: &ParseSess,
505505 }
506506}
507507
508- pub fn parse_nt ( p : & mut Parser , name : & str ) -> Nonterminal {
508+ pub fn parse_nt ( p : & mut Parser , sp : Span , name : & str ) -> Nonterminal {
509509 match name {
510510 "tt" => {
511511 p. quote_depth += 1 us; //but in theory, non-quoted tts might be useful
@@ -541,7 +541,11 @@ pub fn parse_nt(p: &mut Parser, name: &str) -> Nonterminal {
541541 }
542542 "meta" => token:: NtMeta ( p. parse_meta_item ( ) ) ,
543543 _ => {
544- p. fatal ( & format ! ( "unsupported builtin nonterminal parser: {}" , name) [ ] )
544+ p. span_fatal_help ( sp,
545+ & format ! ( "invalid fragment specifier `{}`" , name) [ ] ,
546+ "valid fragment specifiers are `ident`, `block`, \
547+ `stmt`, `expr`, `pat`, `ty`, `path`, `meta`, `tt` \
548+ and `item`")
545549 }
546550 }
547551}
0 commit comments