1#![allow(dead_code)]
4
5#[derive(Clone, Debug, PartialEq)]
8pub enum Pattern {
9 Concat(Vec<Pattern>),
10 Repeated(Box<Repetition>),
12 Submatch(Box<Pattern>),
14 Alternate(Vec<Pattern>),
16 Char(char),
18 Any,
20 Str(String),
22 CharRange(char, char),
24 CharSet(Vec<char>),
26 Anchor(AnchorLocation),
28}
29
30#[derive(Clone, Debug, PartialEq)]
32pub enum AnchorLocation {
33 Begin,
34 End,
35}
36
37#[derive(Clone, Debug, PartialEq)]
43pub enum Repetition {
44 ZeroOrOnce(Pattern),
46 ZeroOrMore(Pattern),
48 OnceOrMore(Pattern),
50 Specific(Pattern, u32, Option<u32>),
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57 use crate::state::*;
58
59 fn simple_re0() -> Pattern {
61 Pattern::Concat(vec![
62 Pattern::CharRange('a', 'a'),
63 Pattern::Alternate(vec![(Pattern::Char('b')), (Pattern::Char('c'))]),
64 ])
65 }
66 fn simple_re1() -> Pattern {
68 Pattern::Concat(vec![
69 Pattern::Repeated(Box::new(Repetition::ZeroOrOnce(Pattern::Submatch(
70 Box::new(Pattern::Concat(vec![
71 Pattern::Char('a'),
72 Pattern::CharRange('b', 'c'),
73 ])),
74 )))),
75 Pattern::Repeated(Box::new(Repetition::ZeroOrMore(Pattern::Submatch(
76 Box::new(Pattern::Concat(vec![
77 Pattern::Char('c'),
78 Pattern::Char('d'),
79 ])),
80 )))),
81 Pattern::Submatch(Box::new(Pattern::Repeated(Box::new(
82 Repetition::OnceOrMore(Pattern::Alternate(vec![
83 (Pattern::Char('e')),
84 (Pattern::Char('f')),
85 ])),
86 )))),
87 Pattern::Repeated(Box::new(Repetition::Specific(
88 Pattern::Char('x'),
89 1,
90 Some(3),
91 ))),
92 Pattern::Alternate(vec![
93 Pattern::Char('g'),
94 Pattern::Repeated(Box::new(Repetition::Specific(
95 Pattern::Char('h'),
96 2,
97 Some(2),
98 ))),
99 (Pattern::Char('i')),
100 ]),
101 Pattern::Repeated(Box::new(Repetition::Specific(Pattern::Char('j'), 2, None))),
102 Pattern::Str("klm".to_string()),
103 ])
104 }
105
106 use crate::compile::start_compile;
107
108 #[test]
109 fn test_re1() {
110 let dot = dot(&start_compile(&simple_re1()));
112 println!("digraph st {{ {} }}", dot);
113 }
114}