1use crate::{deriv_error::DerivError, deriv_n, Bag, Cardinality, Max, Min};
2use core::hash::Hash;
3use serde::{Deserialize, Serialize};
4use std::collections::HashSet;
5use std::fmt;
6use std::fmt::{Debug, Display};
7use itertools::cloned;
9
10#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
11struct Pending<A> {
12 pending: A,
13}
14
15#[derive(Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
17pub enum Rbe<A>
18where
19 A: Hash + Eq + Display,
20{
21 Fail {
22 error: DerivError<A>,
23 },
24 #[default]
25 Empty,
26 Symbol {
27 value: A,
28 card: Cardinality,
29 },
30 And {
31 values: Vec<Rbe<A>>,
32 },
33 Or {
34 values: Vec<Rbe<A>>,
35 },
36 Star {
37 value: Box<Rbe<A>>,
38 },
39 Plus {
40 value: Box<Rbe<A>>,
41 },
42 Repeat {
43 value: Box<Rbe<A>>,
44 card: Cardinality,
45 },
46}
47
48type NullableResult = bool;
49
50impl<A> Rbe<A>
51where
52 A: PartialEq + Eq + Hash + Clone + fmt::Debug + fmt::Display,
53{
54 pub fn match_bag(&self, bag: &Bag<A>, open: bool) -> Result<(), DerivError<A>> {
55 match &self.deriv_bag(bag, open, &self.symbols()) {
56 Rbe::Fail { error } => Err(error.clone()),
57 d => {
58 if d.nullable() {
59 Ok(())
60 } else {
61 Err(DerivError::NonNullable {
62 non_nullable_rbe: Box::new(d.clone()),
63 bag: (*bag).clone(),
64 expr: Box::new((*self).clone()),
65 })
66 }
67 }
68 }
69 }
70
71 pub fn empty() -> Rbe<A> {
72 Rbe::Empty
73 }
74
75 pub fn symbol(x: A, min: usize, max: Max) -> Rbe<A> {
76 Rbe::Symbol {
77 value: x,
78 card: Cardinality {
79 min: Min::from(min),
80 max,
81 },
82 }
83 }
84
85 pub fn or<I>(values: I) -> Rbe<A>
86 where
87 I: IntoIterator<Item = Rbe<A>>,
88 {
89 let rs: Vec<Rbe<A>> = values.into_iter().collect();
90 Rbe::Or { values: rs }
91 }
92
93 pub fn and<I>(values: I) -> Rbe<A>
94 where
95 I: IntoIterator<Item = Rbe<A>>,
96 {
97 let rs: Vec<Rbe<A>> = values.into_iter().collect();
98 Rbe::And { values: rs }
99 }
100
101 pub fn opt(v: Rbe<A>) -> Rbe<A> {
102 Rbe::Or {
103 values: vec![v, Rbe::Empty],
104 }
105 }
106
107 pub fn plus(v: Rbe<A>) -> Rbe<A> {
108 Rbe::Plus { value: Box::new(v) }
109 }
110
111 pub fn star(v: Rbe<A>) -> Rbe<A> {
112 Rbe::Star { value: Box::new(v) }
113 }
114
115 pub fn repeat(v: Rbe<A>, min: usize, max: Max) -> Rbe<A> {
116 Rbe::Repeat {
117 value: Box::new(v),
118 card: Cardinality::from(Min::from(min), max),
119 }
120 }
121
122 pub fn is_fail(&self) -> bool {
123 matches!(self, Rbe::Fail { .. })
124 }
125
126 pub fn symbols(&self) -> HashSet<A> {
127 let mut set = HashSet::new();
128 self.symbols_aux(&mut set);
129 set
130 }
131
132 fn symbols_aux(&self, set: &mut HashSet<A>) {
133 match &self {
134 Rbe::Fail { .. } => (),
135 Rbe::Empty => (),
136 Rbe::Symbol { value, card: _ } => {
137 set.insert(value.clone());
138 }
139 Rbe::And { values } => {
140 values.iter().for_each(|v| v.symbols_aux(set));
141 }
142 Rbe::Or { values } => {
143 values.iter().for_each(|v| v.symbols_aux(set));
144 }
145 Rbe::Plus { value } => {
146 value.symbols_aux(set);
147 }
148 Rbe::Star { value } => {
149 value.symbols_aux(set);
150 }
151 Rbe::Repeat { value, card: _ } => {
152 value.symbols_aux(set);
153 }
154 }
155 }
156
157 pub fn deriv_bag(&self, bag: &Bag<A>, open: bool, controlled: &HashSet<A>) -> Rbe<A> {
158 let mut current = (*self).clone();
159 let mut processed = Bag::new();
160 for (x, card) in bag.iter() {
161 let deriv = current.deriv(x, card, open, controlled);
162 match deriv {
163 Rbe::Fail { error } => {
164 current = Rbe::Fail {
165 error: DerivError::DerivBagError {
166 error_msg: format!("{error}"),
167 processed: Box::new(processed),
168 bag: Box::new((*bag).clone()),
169 expr: Box::new((*self).clone()),
170 current: Box::new(current.clone()),
171 value: (*x).clone(),
172 open,
173 },
174 };
175 break;
176 }
177 _ => {
178 processed.insert((*x).clone());
179 current = deriv;
180 }
181 }
182 }
183 current
184 }
185
186 fn nullable(&self) -> NullableResult {
187 match &self {
188 Rbe::Fail { .. } => false,
189 Rbe::Empty => true,
190 Rbe::Symbol { card, .. } if card.nullable() => true,
191 Rbe::Symbol { .. } => false,
192 Rbe::And { values } => values.iter().all(|v| v.nullable()),
193 Rbe::Or { values } => values.iter().any(|v| v.nullable()),
194 Rbe::Star { .. } => true,
195 Rbe::Plus { value } => value.nullable(),
196 Rbe::Repeat { value: _, card } if card.min.is_0() => true,
197 Rbe::Repeat { value, card: _ } => value.nullable(),
198 }
199 }
200
201 pub fn deriv(&self, x: &A, n: usize, open: bool, controlled: &HashSet<A>) -> Rbe<A>
202 where
203 A: Eq + Hash + Clone,
204 {
205 match *self {
206 ref fail @ Rbe::Fail { .. } => fail.clone(),
207 Rbe::Empty => {
208 if open && !(controlled.contains(x)) {
209 Rbe::Empty
210 } else {
211 Rbe::Fail {
212 error: DerivError::UnexpectedEmpty {
213 x: (*x).clone(),
214 open,
215 },
216 }
217 }
218 }
219 Rbe::Symbol {
220 ref value,
221 ref card,
222 } => {
223 if *x == *value {
224 if card.max == Max::IntMax(0) {
225 Rbe::Fail {
226 error: DerivError::MaxCardinalityZeroFoundValue { x: (*x).clone() },
227 }
228 } else if card.contains(n) {
229 let card = card.minus(n);
230 Self::mk_range_symbol(x, &card)
231 } else {
232 Rbe::Fail {
233 error: DerivError::CardinalityFail {
234 symbol: value.clone(),
235 expected_cardinality: card.clone(),
236 current_number: n,
237 },
238 }
239 }
240 } else if open && !controlled.contains(x) {
241 self.clone()
243 } else {
244 Rbe::Fail {
245 error: DerivError::UnexpectedSymbol {
246 x: (*x).clone(),
247 expected: value.clone(),
248 open,
249 },
250 }
251 }
252 }
253 Rbe::And { ref values } => Self::deriv_and(values, x, n, open, controlled),
254 Rbe::Or { ref values } => {
255 Self::mk_or_values(values.iter().map(|rbe| rbe.deriv(x, n, open, controlled)))
256 }
257 Rbe::Plus { ref value } => {
258 let d = value.deriv(x, n, open, controlled);
259 Self::mk_and(
260 &d,
261 &Rbe::Star {
262 value: value.clone(),
263 },
264 )
265 }
266 Rbe::Repeat {
267 ref value,
268 ref card,
269 } if card.is_0_0() => {
270 let d = value.deriv(x, n, open, controlled);
271 if d.nullable() {
272 Rbe::Fail {
273 error: DerivError::CardinalityZeroZeroDeriv { symbol: x.clone() },
274 }
275 } else {
276 Rbe::Empty
277 }
278 }
279 Rbe::Repeat {
280 ref value,
281 ref card,
282 } => {
283 let d = value.deriv(x, n, open, controlled);
284 let card = card.minus(n);
285 let rest = Self::mk_range(value, &card);
286 Self::mk_and(&d, &rest)
287 }
288 Rbe::Star { ref value } => {
289 let d = value.deriv(x, n, open, controlled);
290 Self::mk_and(&d, value)
291 }
292 }
293 }
294
295 fn deriv_and(
296 values: &Vec<Rbe<A>>,
297 x: &A,
298 n: usize,
299 open: bool,
300 controlled: &HashSet<A>,
301 ) -> Rbe<A> {
302 let mut or_values: Vec<Rbe<A>> = Vec::new();
303 let mut failures = crate::deriv_error::Failures::new();
304
305 for vs in deriv_n(cloned((*values).iter()).collect(), |value: &Rbe<A>| {
306 let d = value.deriv(x, n, open, controlled);
307 match d {
308 Rbe::Fail { error } => {
309 failures.push(value.clone(), error);
310 None
311 }
312 _ => Some(d),
313 }
314 }) {
315 or_values.push(Rbe::And { values: vs });
316 }
317 match or_values.len() {
318 0 => Rbe::Fail {
319 error: DerivError::OrValuesFail {
320 e: Box::new(Rbe::And {
321 values: cloned(values.iter()).collect(),
322 }),
323 failures,
324 },
325 },
326 1 => or_values[0].clone(),
327 _ => Rbe::Or { values: or_values },
328 }
329 }
330
331 fn mk_range(e: &Rbe<A>, card: &Cardinality) -> Rbe<A>
332 where
333 A: Clone,
334 {
335 if Self::bigger(card.min, &card.max) {
336 Rbe::Fail {
337 error: DerivError::RangeLowerBoundBiggerMaxExpr {
338 expr: Box::new((*e).clone()),
339 card: card.clone(),
340 },
341 }
342 } else {
343 match (e, card) {
344 (_, c) if c.is_0_0() => Rbe::Empty,
345 (e, c) if c.is_1_1() => e.clone(),
346 (fail @ Rbe::Fail { .. }, _) => fail.clone(),
347 (Rbe::Empty, _) => Rbe::Empty,
348 (e, c) => Rbe::Repeat {
349 value: Box::new(e.clone()),
350 card: c.clone(),
351 },
352 }
353 }
354 }
355
356 fn mk_range_symbol(x: &A, card: &Cardinality) -> Rbe<A>
357 where
358 A: Clone,
359 {
360 if Self::bigger(card.min, &card.max) {
361 Rbe::Fail {
362 error: DerivError::RangeLowerBoundBiggerMax {
363 symbol: (*x).clone(),
364 card: card.clone(),
365 },
366 }
367 } else {
368 Rbe::Symbol {
369 value: (*x).clone(),
370 card: card.clone(),
371 }
372 }
373 }
374
375 fn mk_and(v1: &Rbe<A>, v2: &Rbe<A>) -> Rbe<A>
376 where
377 A: Clone,
378 {
379 match (v1, v2) {
380 (Rbe::Empty, _) => (*v2).clone(),
381 (_, Rbe::Empty) => (*v1).clone(),
382 (f @ Rbe::Fail { .. }, _) => f.clone(),
383 (_, f @ Rbe::Fail { .. }) => f.clone(),
384 (_, _) => Rbe::And {
385 values: vec![(*v1).clone(), (*v2).clone()],
386 },
387 }
388 }
389
390 fn mk_or_values<I>(values: I) -> Rbe<A>
391 where
392 I: IntoIterator<Item = Rbe<A>>,
393 {
394 let init = Rbe::Fail {
395 error: DerivError::MkOrValuesFail,
396 };
397
398 values
399 .into_iter()
400 .fold(init, |result, value| Self::mk_or(&result, &value))
401 }
402
403 fn mk_or(v1: &Rbe<A>, v2: &Rbe<A>) -> Rbe<A> {
404 match (v1, v2) {
405 (Rbe::Fail { .. }, _) => (*v2).clone(),
406 (_, Rbe::Fail { .. }) => (*v1).clone(),
407 (e1, e2) => {
408 if e1 == e2 {
409 (*v1).clone()
410 } else {
411 Rbe::Or {
412 values: vec![(*v1).clone(), (*v2).clone()],
413 }
414 }
415 }
416 }
417 }
418
419 fn bigger(min: Min, max: &Max) -> bool {
420 match max {
421 Max::Unbounded => false,
422 Max::IntMax(max) => min.value > *max,
423 }
424 }
425}
426
427impl<A> Debug for Rbe<A>
428where
429 A: Debug + Hash + Eq + fmt::Display,
430{
431 fn fmt(&self, dest: &mut fmt::Formatter) -> fmt::Result {
432 match &self {
433 Rbe::Fail { error } => write!(dest, "Fail {{{error:?}}}"),
434 Rbe::Empty => write!(dest, "Empty"),
435 Rbe::Symbol { value, card } => write!(dest, "{value:?}{card:?}"),
436 Rbe::And { values } => values
437 .iter()
438 .try_for_each(|value| write!(dest, "{value:?};")),
439 Rbe::Or { values } => values
440 .iter()
441 .try_for_each(|value| write!(dest, "{value:?}|")),
442 Rbe::Star { value } => write!(dest, "{value:?}*"),
443 Rbe::Plus { value } => write!(dest, "{value:?}+"),
444 Rbe::Repeat { value, card } => write!(dest, "({value:?}){card:?}"),
445 }
446 }
447}
448
449impl<A> Display for Rbe<A>
450where
451 A: Display + Hash + Eq,
452{
453 fn fmt(&self, dest: &mut fmt::Formatter) -> fmt::Result {
454 match &self {
455 Rbe::Fail { error } => write!(dest, "Fail {{{error}}}"),
456 Rbe::Empty => write!(dest, "Empty"),
457 Rbe::Symbol { value, card } => write!(dest, "{value}{card}"),
458 Rbe::And { values } => values.iter().try_for_each(|value| write!(dest, "{value};")),
459 Rbe::Or { values } => values.iter().try_for_each(|value| write!(dest, "{value}|")),
460 Rbe::Star { value } => write!(dest, "{value}*"),
461 Rbe::Plus { value } => write!(dest, "{value}+"),
462 Rbe::Repeat { value, card } => write!(dest, "({value}){card}"),
463 }
464 }
465}
466
467#[cfg(test)]
468mod tests {
469 use super::*;
470 #[test]
474 fn deriv_a_1_1_and_b_opt_with_a() {
475 let rbe = Rbe::and(vec![
477 Rbe::symbol('a', 1, Max::IntMax(1)),
478 Rbe::symbol('b', 0, Max::IntMax(1)),
479 ]);
480 let expected = Rbe::and(vec![
481 Rbe::symbol('a', 0, Max::IntMax(0)),
482 Rbe::symbol('b', 0, Max::IntMax(1)),
483 ]);
484 assert_eq!(
485 rbe.deriv(&'a', 1, false, &HashSet::from(['a', 'b'])),
486 expected
487 );
488 }
489
490 #[test]
491 fn deriv_symbol() {
492 let rbe = Rbe::symbol('x', 1, Max::IntMax(1));
493 let d = rbe.deriv(&'x', 1, true, &HashSet::new());
494 assert_eq!(d, Rbe::symbol('x', 0, Max::IntMax(0)));
495 }
496
497 #[test]
498 fn symbols() {
499 let rbe = Rbe::and(vec![
500 Rbe::symbol('x', 1, Max::IntMax(1)),
501 Rbe::symbol('y', 1, Max::IntMax(1)),
502 ]);
503 let expected = HashSet::from(['x', 'y']);
504 assert_eq!(rbe.symbols(), expected);
505 }
506
507 #[test]
508 fn symbols2() {
509 let rbe = Rbe::and(vec![
510 Rbe::or(vec![
511 Rbe::symbol('x', 1, Max::IntMax(1)),
512 Rbe::symbol('y', 2, Max::Unbounded),
513 ]),
514 Rbe::symbol('y', 1, Max::IntMax(1)),
515 ]);
516 let expected = HashSet::from(['x', 'y']);
517 assert_eq!(rbe.symbols(), expected);
518 }
519
520 #[test]
521 fn match_bag_y1_4_y_2() {
522 let rbe = Rbe::symbol('y', 1, Max::IntMax(4));
524 assert_eq!(rbe.match_bag(&Bag::from(['y', 'y']), false), Ok(()));
525 }
526
527 #[test]
528 fn match_bag_a_opt_or_b_opt_with_a() {
529 let rbe = Rbe::or(vec![
531 Rbe::symbol('a', 0, Max::IntMax(1)),
532 Rbe::symbol('b', 0, Max::IntMax(1)),
533 ]);
534 assert_eq!(rbe.match_bag(&Bag::from(['a']), false), Ok(()));
535 }
536
537 #[test]
538 fn match_bag_a_opt_or_b_opt_with_b() {
539 let rbe = Rbe::or(vec![
541 Rbe::symbol('a', 0, Max::IntMax(1)),
542 Rbe::symbol('b', 0, Max::IntMax(1)),
543 ]);
544 assert_eq!(rbe.match_bag(&Bag::from(['b']), false), Ok(()));
545 }
546
547 #[test]
548 fn match_bag_a_opt_and_b_opt_with_ba() {
549 let rbe = Rbe::and(vec![
551 Rbe::symbol('a', 0, Max::IntMax(1)),
552 Rbe::symbol('b', 0, Max::IntMax(1)),
553 ]);
554 assert_eq!(rbe.match_bag(&Bag::from(['b', 'a']), false), Ok(()));
555 }
556
557 #[test]
558 fn match_bag_a_and_b_opt_with_ab() {
559 let rbe = Rbe::and(vec![
561 Rbe::symbol('a', 1, Max::IntMax(1)),
562 Rbe::symbol('b', 0, Max::IntMax(1)),
563 ]);
564 assert_eq!(rbe.match_bag(&Bag::from(['a', 'b']), false), Ok(()));
565 }
566
567 #[test]
568 fn no_match_bag_a_and_b_opt_with_b_2() {
569 let rbe = Rbe::and(vec![
571 Rbe::symbol('a', 1, Max::IntMax(1)),
572 Rbe::symbol('b', 0, Max::IntMax(1)),
573 ]);
574 assert!(rbe.match_bag(&Bag::from(['b', 'b']), false).is_err());
575 }
576
577 #[test]
578 fn no_match_bag_a_and_b_opt_with_c() {
579 let rbe = Rbe::and(vec![
581 Rbe::symbol('a', 1, Max::IntMax(1)),
582 Rbe::symbol('b', 1, Max::IntMax(1)),
583 ]);
584 assert!(rbe.match_bag(&Bag::from(['c']), false).is_err());
585 }
586
587 #[test]
604 fn test_deserialize_rbe() {
605 let str = r#"{
606 "Symbol": {
607 "value": "foo",
608 "card": {"min": 1, "max": 2 }
609 }
610 }"#;
611 let expected = Rbe::symbol("foo".to_string(), 1, Max::IntMax(2));
612 let rbe: Rbe<String> = serde_json::from_str(str).unwrap();
613 assert_eq!(rbe, expected);
614 }
615}