From 39a849c46cc61cacc84c1d9a7e5c2c05bcf51f1a Mon Sep 17 00:00:00 2001 From: Jonas Maier Date: Fri, 5 Jun 2026 21:59:49 +0200 Subject: parse non-greedy repetitions --- src/parse/regex/bc.rs | 11 +++++------ src/parse/regex/mod.rs | 20 ++++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) (limited to 'src/parse/regex') 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 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 { 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) } -- cgit v1.2.3