diff options
| author | Jonas Maier <jonas@x77.dev> | 2026-06-05 21:59:49 +0200 |
|---|---|---|
| committer | Jonas Maier <jonas@x77.dev> | 2026-06-05 21:59:56 +0200 |
| commit | 39a849c46cc61cacc84c1d9a7e5c2c05bcf51f1a (patch) | |
| tree | 8792798fa613402b40ac00f7164f03adda28eef5 /src/parse | |
| parent | 959e8f2ea9c0b7f52b3ab98244cb110af179b82c (diff) | |
| download | pish-39a849c46cc61cacc84c1d9a7e5c2c05bcf51f1a.tar.gz | |
parse non-greedy repetitions
Diffstat (limited to 'src/parse')
| -rw-r--r-- | src/parse/mod.rs | 4 | ||||
| -rw-r--r-- | src/parse/regex/bc.rs | 11 | ||||
| -rw-r--r-- | src/parse/regex/mod.rs | 20 |
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) } |
