@@ -96,8 +96,13 @@ fn nameize(&&p_s: parse_sess, ms: ~[matcher], &&res: ~[@arb_depth])
96
96
ret ret_val;
97
97
}
98
98
99
+ enum parse_result {
100
+ success( hashmap < ident , @arb_depth > ) ,
101
+ failure( codemap:: span, str)
102
+ }
103
+
99
104
fn parse( sess: parse_sess, cfg: ast:: crate_cfg, rdr: reader, ms: ~[ matcher] )
100
- -> hashmap < ident , @ arb_depth > {
105
+ -> parse_result {
101
106
let mut cur_eis = ~[ ] ;
102
107
vec:: push( cur_eis, new_matcher_pos( ms, none, rdr. peek( ) . sp. lo) ) ;
103
108
@@ -195,13 +200,14 @@ fn parse(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader, ms: ~[matcher])
195
200
196
201
/* error messages here could be improved with links to orig. rules */
197
202
if tok == EOF {
198
- if eof_eis. len( ) == 1 u { /* success */
199
- ret nameize( sess, ms,
200
- vec:: map( eof_eis[ 0 u] . matches, |dv| dv. pop( ) ) ) ;
203
+ if eof_eis. len( ) == 1 u {
204
+ ret success(
205
+ nameize( sess, ms,
206
+ vec:: map( eof_eis[ 0 u] . matches, |dv| dv. pop( ) ) ) ) ;
201
207
} else if eof_eis. len( ) > 1 u {
202
- rdr . fatal ( "Ambiguity : multiple successful parses") ;
208
+ ret failure ( sp , "Ambiguity : multiple successful parses") ;
203
209
} else {
204
- rdr . fatal ( "Unexpected end of macro invocation") ;
210
+ ret failure ( sp , "Unexpected end of macro invocation") ;
205
211
}
206
212
} else {
207
213
if ( bb_eis. len( ) > 0 u && next_eis. len( ) > 0 u)
@@ -210,12 +216,13 @@ fn parse(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader, ms: ~[matcher])
210
216
alt ei. elts[ ei. idx] . node
211
217
{ mtc_bb( _, name, _) { * name } _ { fail; } }
212
218
} ) , " or ") ;
213
- rdr. fatal( #fmt[ "Local ambiguity: multiple parsing options: \
214
- built-in NTs %s or %u other options.",
215
- nts, next_eis. len( ) ] ) ;
219
+ ret failure( sp, #fmt[
220
+ "Local ambiguity: multiple parsing options: \
221
+ built-in NTs %s or %u other options.",
222
+ nts, next_eis. len( ) ] ) ;
216
223
} else if ( bb_eis. len( ) == 0 u && next_eis. len( ) == 0 u) {
217
- rdr . fatal ( "No rules expected the token "
218
- + to_str( * rdr. interner( ) , tok) ) ;
224
+ failure ( sp , "No rules expected the token "
225
+ + to_str( * rdr. interner( ) , tok) ) ;
219
226
} else if ( next_eis. len( ) > 0 u) {
220
227
/* Now process the next token */
221
228
while ( next_eis. len( ) > 0 u) {
0 commit comments