#[macro_export]
macro_rules! eager_macro_rules{
(
$dollar1:tt $id_1:ident
$(
$(#[$($metas:tt)*])*
macro_rules! $macro_name:ident {
$($rules:tt => $expansions:tt);* $(;)*
}
)+
)=>{
$(
eager_macro_rules_internal!{
@first[
$(#[$($metas)*])*
$macro_name $dollar1 $id_1
]
$($rules => $expansions)*
}
)+
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! eager_macro_rules_internal{
(
@first[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$($prev_grammar:tt => $prev_expansion:tt)*
]
) => {
eager_macro_rules_internal!{
@final[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$($prev_grammar => $prev_expansion)*
]
}
};
(
@first[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$($prev_grammar:tt => $prev_expansion:tt)*
]
{$($next_grammar:tt)*} $($rest:tt)+
) => {
eager_macro_rules_internal!{
@expansion[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$($prev_grammar => $prev_expansion)*
[$($next_grammar)*]
]
$($rest)+
}
};
(
@first[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$($prev_grammar:tt => $prev_expansion:tt)*
]
($($next_grammar:tt)*) $($rest:tt)+
) => {
eager_macro_rules_internal!{
@expansion[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$($prev_grammar => $prev_expansion)*
[$($next_grammar)*]
]
$($rest)+
}
};
(
@first[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$($prev_grammar:tt => $prev_expansion:tt)*
]
[$($next_grammar:tt)*] $($rest:tt)+
) => {
eager_macro_rules_internal!{
@expansion[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$($prev_grammar => $prev_expansion)*
[$($next_grammar)*]
]
$($rest)+
}
};
(
@expansion[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$({$($prev_grammar:tt)*} => $prev_expansion:tt)*
[$($next_grammar:tt)*]
]
=> {$($next_expansion:tt)*} $($rest:tt)*
) => {
eager_macro_rules_internal!{
@first[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$({$($prev_grammar)*} => $prev_expansion)*
{$($next_grammar)*} => {$($next_expansion)*}
]
$($rest)*
}
};
(
@expansion[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$({$($prev_grammar:tt)*} => $prev_expansion:tt)*
[$($next_grammar:tt)*]
]
=> ($($next_expansion:tt)*) $($rest:tt)*
) => {
eager_macro_rules_internal!{
@first[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$({$($prev_grammar)*} => $prev_expansion)*
{$($next_grammar)*} => {$($next_expansion)*}
]
$($rest)*
}
};
(
@expansion[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$({$($prev_grammar:tt)*} => $prev_expansion:tt)*
[$($next_grammar:tt)*]
]
=> [$($next_expansion:tt)*] $($rest:tt)*
) => {
eager_macro_rules_internal!{
@first[
$(#[$($metas)*])*
$macro_name$dollar1 $id_1
$({$($prev_grammar)*} => $prev_expansion)*
{$($next_grammar)*} => {$($next_expansion)*}
]
$($rest)*
}
};
( @final[
$(#[$($metas:tt)*])*
$macro_name:ident $dollar1:tt $id_1:ident
$({$($rules_grammar:tt)*} => {$($rules_expansion:tt)*})+
]
)=>{
$(#[$($metas)*])*
macro_rules! $macro_name{
$(
{
@eager[$dollar1($dollar1 $id_1:tt)*]
$($rules_grammar)*
} => {
eager_internal!{
@from_macro[$dollar1($dollar1 $id_1)*]
$($rules_expansion)*
}
};
)+
$(
{$($rules_grammar)*} => {$($rules_expansion)*};
)+
}
};
}