#[macro_export]
macro_rules! eval_postfix {
(@operator [$b:expr, $a:expr $(,$call_stack:expr)*] $operator:tt $($leftover:tt)*) => {
eval_postfix!([$a $operator $b $(,$call_stack)*] $($leftover)*)
};
(@operator $call_stack:tt $operator:tt $($leftover:tt)*) => {
compile_error!(concat!("Could not apply operator `",
stringify!($operator),
"` to the current call stack: ",
stringify!($call_stack)
)
)
};
($call_stack:tt + $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack + $($leftover)*)
};
($call_stack:tt - $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack - $($leftover)*)
};
($call_stack:tt * $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack * $($leftover)*)
};
($call_stack:tt / $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack / $($leftover)*)
};
($call_stack:tt % $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack % $($leftover)*)
};
($call_stack:tt > $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack > $($leftover)*)
};
($call_stack:tt >= $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack >= $($leftover)*)
};
($call_stack:tt < $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack < $($leftover)*)
};
($call_stack:tt <= $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack <= $($leftover)*)
};
($call_stack:tt == $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack == $($leftover)*)
};
($call_stack:tt != $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack != $($leftover)*)
};
($call_stack:tt && $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack && $($leftover)*)
};
($call_stack:tt || $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack || $($leftover)*)
};
($call_stack:tt ^ $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack ^ $($leftover)*)
};
($call_stack:tt & $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack & $($leftover)*)
};
($call_stack:tt | $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack | $($leftover)*)
};
($call_stack:tt << $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack << $($leftover)*)
};
($call_stack:tt >> $($leftover:tt)*) => {
eval_postfix!(@operator $call_stack >> $($leftover)*)
};
([$($call_stack:expr),*] $num:tt $($leftover:tt)*) => {
eval_postfix!([$num $(,$call_stack)*] $($leftover)*)
};
([$res:expr]) => {
$res
};
([$($call_stack:expr),*]) => {
compile_error!(concat!("Error: Could not find final value \
for the expression. \
Maybe you missed an operator? \
Final call stack: ",
stringify!([$($call_stack),*])
)
)
};
($($tokens:tt)*) => {
eval_postfix!([] $($tokens)*)
};
}
pub use eval_postfix;