macro_rules! declare_machine {
(@inner next $new_state:ident{$($new_el:ident:$new_el_val:expr),*}) => { ... };
(@inner next $new_state:ident) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident;$callback:block;$new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident;$callback:block;) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident; ;$new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident ; ;) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident;$callback:block;$new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident;$callback:block;) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident; ;$new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*) => { ... };
(@inner command @$glob_context:ident@ $sel:ident:$cur:ident ; ;) => { ... };
(@inner context $ss:ident $sel:ident) => { ... };
(@inner context $ss:ident ) => { ... };
(@inner >> $($sel:ident)* @$glob_context:ident@ $income:block) => { ... };
(@inner << $($sel:ident)* @$glob_context:ident@ $outcome:block) => { ... };
(@inner >> $($sel:ident)* @$glob_context:ident@ ) => { ... };
(@inner << $($sel:ident)* @$glob_context:ident@ ) => { ... };
(@inner params $state:ident {$($el:ident:$typ:ty);*}) => { ... };
(@inner params $state:ident) => { ... };
(@inner initial $initial:ident{$($init_field:ident:$init_val:expr),*}) => { ... };
(@inner initial $initial:ident) => { ... };
(@cmd_processor $sel:ident @$glob_context:ident@ ($($cmd:ident $($callback:block)* => $($new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*)*;)*)) => { ... };
(@state $gc_name:ident; $($state:ident @ $sel:ident ; $($income:block)*; ($job:tt); $($outcome:block)*@),*) => { ... };
(@state ; $($state:ident @ $sel:ident ; $($income:block)*; ($job:tt); $($outcome:block)* @),*) => { ... };
(@state $gc_name:ident; $($state:ident@; $($income:block)*; ($job:tt); $($outcome:block)*@),*) => { ... };
(@state ; $($state:ident@; $($income:block)*; ($job:tt); $($outcome:block)*@),*) => { ... };
(
$machine:ident $($gc_name:ident{$($context_field:ident:$context_type:ty),*})* ($initial:ident$({$($init_field:ident:$init_val:expr),*})*)
states[$($states:ident),*]
commands[$($commands:ident),*]
$(($state:ident $($sel:ident)*$({$($el:ident:$typ:ty);*})*:
$(>> $income:block)*
$(<< $outcome:block)*
$($cmd:ident $($callback:block)* => $($new_state:ident$({$($new_el:ident:$new_el_val:expr),*})*)*;)*
))*
) => { ... };
}