mod tests; use crate::ast::{Node, Token}; fn compute(operator: Token, lhs: bool, rhs: bool) -> bool { match operator { Token::Negation => !lhs, Token::Conjunction => lhs & rhs, Token::Disjunction => lhs | rhs, Token::ExclusiveDisjunction => lhs ^ rhs, Token::MaterialCondition => !(lhs && !rhs), Token::LogicalEquivalence => lhs == rhs, } } fn evaluate(tree: Node) -> bool { match tree { Node::Unary { operator, operand } => compute(operator, evaluate(*operand), false), Node::Binary { operator, lhs, rhs } => compute(operator, evaluate(*lhs), evaluate(*rhs)), Node::Leaf(b) => b, } } pub fn eval_formula(formula: &str) -> bool { let tree = Node::::parse_formula(formula); evaluate(tree) }