macro_rules! bdd {
    ($vars:ident, ($($e:tt)*)) => { ... };
    ( ( $($e:tt)* ) ) => { ... };
    ($vars:ident, $bdd:literal) => { ... };
    ($vars:ident, $bdd:ident) => { ... };
    ($bdd:ident) => { ... };
    ($vars:ident, !$e:tt) => { ... };
    ($vars:ident, $l:tt & $r:tt) => { ... };
    ($vars:ident, $l:tt | $r:tt) => { ... };
    ($vars:ident, $l:tt <=> $r:tt) => { ... };
    ($vars:ident, $l:tt => $r:tt) => { ... };
    ($vars:ident, $l:tt ^ $r:tt) => { ... };
    (!$e:tt) => { ... };
    ($l:tt & $r:tt) => { ... };
    ($l:tt | $r:tt) => { ... };
    ($l:tt <=> $r:tt) => { ... };
    ($l:tt => $r:tt) => { ... };
    ($l:tt ^ $r:tt) => { ... };
}
Expand description

A macro for simplifying Bdd operations. It evaluates given expression over Bdds where you can use standard boolean operators !, &, |, ^, => and <=>.

Sadly, except for the very top expression, every level needs to be enclosed in parentheses since rust macros cannot parse complex expressions with potential ambiguities. You can’t write x & y & z, you have to use (x & y) & z. Also !x & z is not permitted, you have to use (!x) & z.

See tutorial for usage examples.