ready_set_boole/src/boolean_evaluation.rs

28 lines
802 B
Rust
Raw Permalink Normal View History

2024-01-05 16:11:59 +00:00
mod tests;
2024-01-24 12:27:46 +00:00
use crate::ast::{Node, Token};
2024-01-05 16:11:59 +00:00
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),
2024-01-24 12:27:46 +00:00
Token::LogicalEquivalence => lhs == rhs,
2024-01-05 16:11:59 +00:00
}
}
fn evaluate(tree: Node<bool>) -> 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,
}
}
2024-01-22 09:10:45 +00:00
pub fn eval_formula(formula: &str) -> bool {
2024-01-22 17:34:40 +00:00
let tree = Node::<bool>::parse_formula(formula);
2024-01-05 16:11:59 +00:00
evaluate(tree)
2024-01-24 12:27:46 +00:00
}