#![allow(dead_code)]
#[derive(Clone, Debug, PartialEq)]
pub enum Pattern {
Concat(Vec<Pattern>),
Repeated(Box<Repetition>),
Submatch(Box<Pattern>),
Alternate(Vec<Pattern>),
Char(char),
Any,
Str(String),
CharRange(char, char),
CharSet(Vec<char>),
Anchor(AnchorLocation),
}
#[derive(Clone, Debug, PartialEq)]
pub enum AnchorLocation {
Begin,
End,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Repetition {
ZeroOrOnce(Pattern),
ZeroOrMore(Pattern),
OnceOrMore(Pattern),
Specific(Pattern, u32, Option<u32>),
}
#[cfg(test)]
mod tests {
use super::*;
use crate::state::*;
fn simple_re0() -> Pattern {
Pattern::Concat(vec![
Pattern::CharRange('a', 'a'),
Pattern::Alternate(vec![(Pattern::Char('b')), (Pattern::Char('c'))]),
])
}
fn simple_re1() -> Pattern {
Pattern::Concat(vec![
Pattern::Repeated(Box::new(Repetition::ZeroOrOnce(Pattern::Submatch(
Box::new(Pattern::Concat(vec![
Pattern::Char('a'),
Pattern::CharRange('b', 'c'),
])),
)))),
Pattern::Repeated(Box::new(Repetition::ZeroOrMore(Pattern::Submatch(
Box::new(Pattern::Concat(vec![
Pattern::Char('c'),
Pattern::Char('d'),
])),
)))),
Pattern::Submatch(Box::new(Pattern::Repeated(Box::new(
Repetition::OnceOrMore(Pattern::Alternate(vec![
(Pattern::Char('e')),
(Pattern::Char('f')),
])),
)))),
Pattern::Repeated(Box::new(Repetition::Specific(
Pattern::Char('x'),
1,
Some(3),
))),
Pattern::Alternate(vec![
Pattern::Char('g'),
Pattern::Repeated(Box::new(Repetition::Specific(
Pattern::Char('h'),
2,
Some(2),
))),
(Pattern::Char('i')),
]),
Pattern::Repeated(Box::new(Repetition::Specific(Pattern::Char('j'), 2, None))),
Pattern::Str("klm".to_string()),
])
}
use crate::compile::start_compile;
#[test]
fn test_re1() {
let dot = dot(&start_compile(&simple_re1()));
println!("digraph st {{ {} }}", dot);
}
}