Skip to content

Commit a8112f3

Browse files
committed
Allow soft failure of the macro parser.
1 parent 7f9b1fb commit a8112f3

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

src/libsyntax/ext/tt/earley_parser.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,13 @@ fn nameize(&&p_s: parse_sess, ms: ~[matcher], &&res: ~[@arb_depth])
9696
ret ret_val;
9797
}
9898

99+
enum parse_result {
100+
success(hashmap<ident, @arb_depth>),
101+
failure(codemap::span, str)
102+
}
103+
99104
fn parse(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader, ms: ~[matcher])
100-
-> hashmap<ident,@arb_depth> {
105+
-> parse_result {
101106
let mut cur_eis = ~[];
102107
vec::push(cur_eis, new_matcher_pos(ms, none, rdr.peek().sp.lo));
103108

@@ -195,13 +200,14 @@ fn parse(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader, ms: ~[matcher])
195200

196201
/* error messages here could be improved with links to orig. rules */
197202
if tok == EOF {
198-
if eof_eis.len() == 1u { /* success */
199-
ret nameize(sess, ms,
200-
vec::map(eof_eis[0u].matches, |dv| dv.pop()));
203+
if eof_eis.len() == 1u {
204+
ret success(
205+
nameize(sess, ms,
206+
vec::map(eof_eis[0u].matches, |dv| dv.pop())));
201207
} else if eof_eis.len() > 1u {
202-
rdr.fatal("Ambiguity: multiple successful parses");
208+
ret failure(sp, "Ambiguity: multiple successful parses");
203209
} else {
204-
rdr.fatal("Unexpected end of macro invocation");
210+
ret failure(sp, "Unexpected end of macro invocation");
205211
}
206212
} else {
207213
if (bb_eis.len() > 0u && next_eis.len() > 0u)
@@ -210,12 +216,13 @@ fn parse(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader, ms: ~[matcher])
210216
alt ei.elts[ei.idx].node
211217
{ mtc_bb(_,name,_) { *name } _ { fail; } }
212218
}), " 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()]);
216223
} else if (bb_eis.len() == 0u && next_eis.len() == 0u) {
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));
219226
} else if (next_eis.len() > 0u) {
220227
/* Now process the next token */
221228
while(next_eis.len() > 0u) {

src/libsyntax/parse/parser.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,7 +1210,7 @@ class parser {
12101210

12111211
/* temporary */
12121212
fn parse_tt_mac_demo() -> @expr {
1213-
1213+
import ext::tt::earley_parser::{parse,success,failure};
12141214
let name_idx = @mut 0u;
12151215
let ms = self.parse_seq(token::LBRACE, token::RBRACE,
12161216
common::seq_sep_none(),
@@ -1225,8 +1225,10 @@ class parser {
12251225
self.reader.interner(), none, tts)
12261226
as reader;
12271227

1228-
let matches = ext::tt::earley_parser::parse
1229-
(self.sess, self.cfg, rdr, ms);
1228+
let matches = alt parse(self.sess, self.cfg, rdr, ms) {
1229+
success(m) { m }
1230+
failure(sp, msg) { self.span_fatal(sp,msg); }
1231+
};
12301232

12311233
let transcriber = ext::tt::transcribe::new_tt_reader
12321234
(self.reader.span_diag(), self.reader.interner(),

0 commit comments

Comments
 (0)