#[macro_export]
macro_rules! regex {
(@q * $($res:tt)*) => {
$crate::regex::many0($($res)*)
};
(@q ? $($res:tt)*) => {
$crate::regex::opt($($res)*)
};
(@q + $($res:tt)*) => {
$crate::regex::many1($($res)*)
};
(@q {$st:literal} $($res:tt)*) => {
$crate::regex::count::<$st, $st, _, _>($($res)*)
};
(@q {$st:literal,} $($res:tt)*) => {
$crate::regex::count::<$st, {usize::MAX}, _, _>($($res)*)
};
(@q {$st:literal, $ed:literal} $($res:tt)*) => {
$crate::regex::count::<$st, $ed, _, _>($($res)*)
};
(@q $($res:tt)*) => {
$crate::regex::once($($res)*)
};
(@r ^ $($res:tt)*) => { regex!(@q $($res)* $crate::neu!(^))
};
(@r . $($res:tt)*) => { regex!(@q $($res)* $crate::neu!(.))
};
(@r [ $($range:tt)+ ] $($res:tt)*) => {
regex!(@q $($res)* $crate::neu!([$($range)+]))
};
(@r $ch:ident $($res:tt)*) => {
regex!(@q $($res)* $crate::neu::equal($crate::charize!($ch)))
};
(@r $ch:literal $($res:tt)*) => {
regex!(@q $($res)* $crate::neu::equal($ch))
};
(@r ($($regex:expr),+) $($res:tt)*) => {
{
let re = $crate::neu::never();
$(
let re = re.or($regex);
)+
regex!(@q $($res)* re)
}
};
(@r $($res:tt)*) => {
regex!(@q $($res)* $crate::neu::whitespace())
};
($($res:tt)*) => {
regex!(@r $($res)*)
};
}
#[macro_export]
macro_rules! neu {
(^) => { $crate::neu::whitespace().not()
};
(.) => { $crate::neu::wild()
};
([^$l:literal - $r:literal] ) => {
$crate::neu::range($l..=$r).not()
};
([^$l:ident - $r:ident] ) => {
$crate::neu::range($crate::charize!($l)..(char::from_u32($crate::charize!($r) as u32 + 1).unwrap())).not()
};
([$l:literal - $r:literal] ) => {
$crate::neu::range($l..=$r)
};
([$l:ident - $r:ident] ) => {
$crate::neu::range($crate::charize!($l)..(char::from_u32($crate::charize!($r) as u32 + 1).unwrap()))
};
([^$($l:literal - $r:literal)+] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::range($l..=$r));
)+
re.not()
}
};
([^$($l:ident - $r:ident)+] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::range($crate::charize!($l)..=$crate::charize!($r)));
)+
re.not()
}
};
([$($l:literal - $r:literal)+] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::range($l..=$r));
)+
re
}
};
([$($l:ident - $r:ident)+] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::range($crate::charize!($l)..=$crate::charize!($r)));
)+
re
}
};
([ ^ $($ch:literal)+ ] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::equal($ch));
)+
re.not()
}
};
([ ^ $($ch:ident)+ ] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::equal($crate::charize!($ch)));
)+
re.not()
}
};
([ $($ch:literal)+ ] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::equal($ch));
)+
re
}
};
([ $($ch:ident)+ ] ) => { {
let re = $crate::neu::never();
$(
let re = re.or($crate::neu::equal($crate::charize!($ch)));
)+
re
}
};
(($($regex:expr),+)) => {
{
let re = $crate::neu::never();
$(
let re = re.or($regex);
)+
re
}
};
($ch:ident ) => {
$crate::neu::equal($crate::charize!($ch))
};
($ch:literal ) => {
$crate::neu::equal($ch)
};
() => {
$crate::neu::space()
};
}
#[macro_export]
macro_rules! escape_strval {
($quote:literal, $prefix:literal, $escape:expr) => {{
let escape = $escape;
let escape = $prefix.then(escape);
let cond = $crate::neu::regex_cond($crate::regex::not(escape.clone()));
$quote
.not()
.many1()
.set_cond(cond)
.or(escape)
.repeat(0..)
.pat()
}};
}