macro_rules! enum_parser {
    ( $enum_name:ident, $($rest:tt)* ) => { ... };
    (
		input_lifetime = $inp:lifetime;
		$enum_name:ident <$param:tt>,
		$($rest:tt)*
	) => { ... };
    ( @variants $enum_name:ident, $parser:ident $(,)? ) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident { $($var_fields:tt)* } = |$var_arg:ident| { $($var_body:tt)* }
		$(,$($rest:tt)*)?
	) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident ( $($var_fields:tt)* ) = |$var_arg:ident| { $($var_body:tt)* }
		$(, $($rest:tt)* )?
	) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident { $($var_fields:tt)* } = [ $($var_args:tt)* ]
		$(, $($rest:tt)* )?
	) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident ( $($var_fields:tt)* ) = [ $($var_args:tt)* ]
		$(, $($rest:tt)* )?
	) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident = [ $($var_args:tt)* ]
		$(, $($rest:tt)* )?
	) => { ... };
    (
		@variants $enum_name:ident, $parser:ident,
		$var_name:ident = |$var_arg:ident| { $($var_body:tt)* }
		$(, $($rest:tt)* )?
	) => { ... };
}