diff options
| author | Piotr Czarnecki <pioczarn@gmail.com> | 2014-10-24 14:28:10 +0100 |
|---|---|---|
| committer | Piotr Czarnecki <pioczarn@gmail.com> | 2014-10-24 17:59:29 +0100 |
| commit | e2e47d6eb5425cd860137d632c1b8688e5e74241 (patch) | |
| tree | 66873e2d6c18f8f768417f6f252d592d5e4fed30 | |
| parent | 00cc6d24099eb93ecfeb9bf807ab9e5130a01749 (diff) | |
| download | rust-e2e47d6eb5425cd860137d632c1b8688e5e74241.tar.gz rust-e2e47d6eb5425cd860137d632c1b8688e5e74241.zip | |
regex: Fix control flow in the parser
| -rw-r--r-- | src/libregex/parse.rs | 32 | ||||
| -rw-r--r-- | src/libregex/test/tests.rs | 10 |
2 files changed, 24 insertions, 18 deletions
diff --git a/src/libregex/parse.rs b/src/libregex/parse.rs index 1d1d1a0e9c5..2b6aa669f3c 100644 --- a/src/libregex/parse.rs +++ b/src/libregex/parse.rs @@ -411,9 +411,6 @@ impl<'a> Parser<'a> { ast => fail!("Unexpected AST item '{}'", ast), } } - _ => {}, - } - match c { ']' => { if ranges.len() > 0 { let flags = negated | (self.flags & FLAG_NOCASE); @@ -431,22 +428,21 @@ impl<'a> Parser<'a> { } return Ok(()) } - c => { - if self.peek_is(1, '-') && !self.peek_is(2, ']') { - try!(self.expect('-')) - try!(self.noteof("not a ']'")) - let c2 = self.cur(); - if c2 < c { - return self.err(format!("Invalid character class \ - range '{}-{}'", - c, - c2).as_slice()) - } - ranges.push((c, self.cur())) - } else { - ranges.push((c, c)) - } + } + + if self.peek_is(1, '-') && !self.peek_is(2, ']') { + try!(self.expect('-')) + try!(self.noteof("not a ']'")) + let c2 = self.cur(); + if c2 < c { + return self.err(format!("Invalid character class \ + range '{}-{}'", + c, + c2).as_slice()) } + ranges.push((c, self.cur())) + } else { + ranges.push((c, c)) } } } diff --git a/src/libregex/test/tests.rs b/src/libregex/test/tests.rs index 088425c0888..fa645c84dd8 100644 --- a/src/libregex/test/tests.rs +++ b/src/libregex/test/tests.rs @@ -43,6 +43,16 @@ fn empty_regex_nonempty_match() { assert_eq!(ms, vec![(0, 0), (1, 1), (2, 2), (3, 3)]); } +#[test] +fn quoted_bracket_set() { + let re = regex!(r"([\x{5b}\x{5d}])"); + let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>(); + assert_eq!(ms, vec![(0, 1), (1, 2)]); + let re = regex!(r"([\[\]])"); + let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>(); + assert_eq!(ms, vec![(0, 1), (1, 2)]); +} + macro_rules! replace( ($name:ident, $which:ident, $re:expr, $search:expr, $replace:expr, $result:expr) => ( |
