use proc_macro2::{Ident, TokenStream};
use quote::quote;
use crate::flatten;
use self::{dfa::Dfa, nfa::Nfa};
mod dfa;
mod generate;
mod matching;
mod nfa;
mod parse;
#[derive(Debug)]
pub enum Repeat {
Once,
ZeroOrOnce,
OnceOrMore,
ZeroOrMore,
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]
pub enum GroupEntry {
Char(char),
Range(char, char),
}
#[derive(Debug)]
pub enum Atom {
Literal(String),
Group(bool, Vec<GroupEntry>),
}
#[derive(Debug)]
pub struct AtomRepeat {
pub atom: Atom,
pub repeat: Repeat,
}
pub struct SimpleRegexAst {
pub atoms: Vec<AtomRepeat>,
}
pub struct SimpleRegex {
pub ast: SimpleRegexAst,
pub dfa: Dfa,
}
impl SimpleRegex {
pub fn parse(from: &str) -> Option<SimpleRegex> {
let parsed = SimpleRegexAst::parse(from)?;
let nfa = Nfa::build(&parsed);
Some(SimpleRegex {
ast: parsed,
dfa: Dfa::build(&nfa),
})
}
}