macro_rules! parse {
(
day $apply: ident, $ctx: tt, $val: expr;
$day: ident => $( $tail: tt )*
) => { ... };
(
day $apply: ident, $ctx: tt, $val: expr;
$day: ident : $generator: ident => $( $tail: tt )*
) => { ... };
(
day $apply: ident, $ctx: tt, $val: expr;
$day: ident : $generator: ident ? => $( $tail: tt )*
) => { ... };
( day $apply: ident, $ctx: tt, $val: expr; ) => { ... };
(
sol $apply: ident, $ctx: tt, $val: expr;
{ day $day: tt { $gen: tt { $( $acc: tt )* } } } ;
$sol: ident ? $( $tail: tt )*
) => { ... };
(
sol $apply: ident, $ctx: tt, $val: expr;
{ day $day: tt { $gen: tt { $( $acc: tt )* } } } ;
$sol: ident $( $tail: tt )*
) => { ... };
(
post_sol $apply: ident, $ctx: tt, $val: expr;
$curr: tt ; , $( $tail: tt )*
) => { ... };
(
post_sol $apply: ident, $ctx: tt, $val: expr;
$curr: tt ; ; $( $tail: tt )*
) => { ... };
( $apply: ident $ctx: tt; $( $tt: tt )* ) => { ... };
}