aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parse/mod.rs4
-rw-r--r--src/parse/regex/bc.rs11
-rw-r--r--src/parse/regex/mod.rs20
3 files changed, 14 insertions, 21 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 10ea979..407cebd 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -1191,9 +1191,7 @@ pub enum ParseError {
}
#[derive(Debug, PartialEq)]
-pub enum NotImplementedKind {
- NonGreedyRegexRepetition,
-}
+pub enum NotImplementedKind {}
type Result<T> = std::result::Result<T, ParseError>;
diff --git a/src/parse/regex/bc.rs b/src/parse/regex/bc.rs
index c0eff8b..6b3ca1b 100644
--- a/src/parse/regex/bc.rs
+++ b/src/parse/regex/bc.rs
@@ -2,12 +2,8 @@ use std::collections::{HashMap, VecDeque};
use crate::{
bitset::BitSet,
- parse::{
- Parse,
- regex::{
- CharacterClass, GreedyBehavior, LookDirection, LookPolarity, Pattern,
- byte_range::ByteRange,
- },
+ parse::regex::{
+ CharacterClass, GreedyBehavior, LookDirection, LookPolarity, Pattern, byte_range::ByteRange,
},
};
@@ -586,6 +582,9 @@ impl TryFrom<Pattern> for BytecodeCompiledRegex {
}
}
+#[cfg(test)]
+use crate::parse::Parse;
+
#[test]
fn print_compiled_vm() {
let pat = Pattern::parse_from_bytes(b"a?b?").unwrap();
diff --git a/src/parse/regex/mod.rs b/src/parse/regex/mod.rs
index 79e234f..6b7bc9e 100644
--- a/src/parse/regex/mod.rs
+++ b/src/parse/regex/mod.rs
@@ -1,4 +1,4 @@
-use crate::parse::{NotImplementedKind, OtherHighlights};
+use crate::parse::OtherHighlights;
use super::{Parse, ParseError, Result};
@@ -234,18 +234,14 @@ fn parse_rep(s: &mut super::Cursor<'_>) -> Result<Pattern> {
s.adv();
s.highlight_from(begin, OtherHighlights::RegexSymbol);
- if s.has() && s.peek() == b'?' {
- return Err(ParseError::NotYetImplemented(
- NotImplementedKind::NonGreedyRegexRepetition,
- ));
- }
+ let greed = if s.has() && s.peek() == b'?' {
+ s.adv();
+ GreedyBehavior::NonGreedy
+ } else {
+ GreedyBehavior::Greedy
+ };
- Ok(Pattern::Rep(
- Box::new(atom),
- min_rep,
- max_rep,
- GreedyBehavior::Greedy,
- ))
+ Ok(Pattern::Rep(Box::new(atom), min_rep, max_rep, greed))
} else {
Ok(atom)
}