2022-10-15 00:01:37 -04:00
|
|
|
use std::cell::RefCell;
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
2022-07-16 17:27:08 -04:00
|
|
|
use nom::branch::alt;
|
2022-10-15 14:04:24 -04:00
|
|
|
use nom::combinator::not;
|
2022-07-15 23:26:49 -04:00
|
|
|
use nom::error::VerboseError;
|
2022-07-16 16:31:00 -04:00
|
|
|
use nom::IResult;
|
2022-10-15 00:01:37 -04:00
|
|
|
use nom::Parser;
|
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
type Link<'r, T> = Option<&'r Node<'r, T>>;
|
2022-11-24 14:59:37 -05:00
|
|
|
type Matcher = dyn for<'s> Fn(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>>;
|
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
pub struct Node<'r, T> {
|
2022-11-24 14:59:37 -05:00
|
|
|
elem: T,
|
2022-11-24 15:06:07 -05:00
|
|
|
next: Link<'r, T>,
|
2022-11-24 14:59:37 -05:00
|
|
|
}
|
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
pub struct List<'r, T> {
|
|
|
|
head: Link<'r, T>,
|
2022-11-24 14:59:37 -05:00
|
|
|
}
|
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
impl<'r, T> List<'r, T> {
|
2022-11-24 14:59:37 -05:00
|
|
|
pub fn new() -> Self {
|
|
|
|
List { head: None }
|
|
|
|
}
|
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
pub fn with_additional_node(&self, element: T) -> Node<'r, T> {
|
|
|
|
let new_node = Node {
|
2022-11-24 14:59:37 -05:00
|
|
|
elem: element,
|
2022-11-24 15:06:07 -05:00
|
|
|
next: self.head,
|
|
|
|
};
|
2022-11-24 14:59:37 -05:00
|
|
|
|
2022-11-24 15:06:07 -05:00
|
|
|
new_node
|
2022-11-24 14:59:37 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ContextElement<'r> {
|
|
|
|
fail_matcher: ChainBehavior<'r>,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum ChainBehavior<'r> {
|
|
|
|
AndParent(Option<&'r Matcher>),
|
|
|
|
IgnoreParent(Option<&'r Matcher>),
|
|
|
|
}
|