From 522021b107c00bbd146dbc0f813d16e3bce8e550 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 15 Jan 2019 15:57:29 -0800 Subject: [PATCH] Fix NFA generation w/ nested groups --- .../generate/prepare_grammar/expand_tokens.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/cli/src/generate/prepare_grammar/expand_tokens.rs b/cli/src/generate/prepare_grammar/expand_tokens.rs index 9cc527bd..6b92713e 100644 --- a/cli/src/generate/prepare_grammar/expand_tokens.rs +++ b/cli/src/generate/prepare_grammar/expand_tokens.rs @@ -263,7 +263,7 @@ impl NfaBuilder { Ok(result) } }, - Ast::Group(group) => self.expand_regex(&group.ast, self.nfa.last_state_id()), + Ast::Group(group) => self.expand_regex(&group.ast, next_state_id), Ast::Alternation(alternation) => { let mut alternative_state_ids = Vec::new(); for ast in alternation.asts.iter() { @@ -619,7 +619,18 @@ mod tests { ("12e34", Some((0, "12e34"))), ], }, - // Allowing unrecognized escape sequences + // nested groups + Row { + rules: vec![Rule::seq(vec![ + Rule::pattern(r#"([^x\\]|\\(.|\n))+"#), + ])], + separators: vec![], + examples: vec![ + ("abcx", Some((0, "abc"))), + ("abc\\0x", Some((0, "abc\\0"))), + ], + }, + // allowing unrecognized escape sequences Row { rules: vec![ // Escaped forward slash (used in JS because '/' is the regex delimiter) @@ -636,7 +647,7 @@ mod tests { (r#"'\'a"#, Some((2, r#"'\'"#))), ], }, - // Allowing un-escaped curly braces + // allowing un-escaped curly braces Row { rules: vec![ // Un-escaped curly braces @@ -649,7 +660,6 @@ mod tests { ("u{1234} ok", Some((0, "u{1234}"))), ("{aba}}", Some((1, "{aba}"))), ], - } ];