Define Expression type

This commit is contained in:
cdo committed 2026-09-26 09:11:01 +01:00
1 parent 06f125a486
commit fbab9c521d
2 files changed
+137

No files matched your search

+135
View File
@@ -0,0 +1,135 @@
#[derive(Debug, PartialEq)]
pub enum Expression {
Symbol(char),
Integer(i32),
Sum(std::boxed::Box<Expression>, std::boxed::Box<Expression>),
Difference(std::boxed::Box<Expression>, std::boxed::Box<Expression>),
Product(std::boxed::Box<Expression>, std::boxed::Box<Expression>),
Quotient(std::boxed::Box<Expression>, std::boxed::Box<Expression>),
Exponent(std::boxed::Box<Expression>, std::boxed::Box<Expression>),
}
impl Expression {
pub fn sum(left: Expression, right: Expression) -> Expression {
Expression::Sum(
std::boxed::Box::new(left), std::boxed::Box::new(right))
}
pub fn difference(left: Expression, right: Expression) -> Expression {
Expression::Difference(
std::boxed::Box::new(left), std::boxed::Box::new(right))
}
pub fn product(left: Expression, right: Expression) -> Expression {
Expression::Product(
std::boxed::Box::new(left), std::boxed::Box::new(right))
}
pub fn quotient(left: Expression, right: Expression) -> Expression {
Expression::Quotient(
std::boxed::Box::new(left), std::boxed::Box::new(right))
}
pub fn exponent(left: Expression, right: Expression) -> Expression {
Expression::Exponent(
std::boxed::Box::new(left), std::boxed::Box::new(right))
}
pub fn is_constant(&self) -> bool {
match self {
Expression::Integer(_) => true,
Expression::Symbol(_) => false,
Expression::Sum(x, y) => x.is_constant() && y.is_constant(),
Expression::Difference(x, y) =>
x.is_constant() && y.is_constant(),
Expression::Product(x, y) => x.is_constant() && y.is_constant(),
Expression::Quotient(x, y) => x.is_constant() && y.is_constant(),
Expression::Exponent(x, y) => x.is_constant() && y.is_constant(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn integer_is_constant() {
assert!(Expression::Integer(1).is_constant());
}
#[test]
fn symbol_is_not_constant() {
assert!(!Expression::Symbol('x').is_constant());
}
#[test]
fn sum_of_integers_is_constant() {
assert!(Expression::sum(
Expression::Integer(1),
Expression::Integer(1)).is_constant());
}
#[test]
fn sum_of_integer_and_symbol_is_not_constant() {
assert!(!Expression::sum(
Expression::Symbol('x'),
Expression::Integer(1)).is_constant());
}
#[test]
fn difference_of_integers_is_constant() {
assert!(Expression::difference(
Expression::Integer(1),
Expression::Integer(1)).is_constant());
}
#[test]
fn difference_of_integer_and_symbol_is_not_constant() {
assert!(!Expression::difference(
Expression::Symbol('x'),
Expression::Integer(1)).is_constant());
}
#[test]
fn product_of_integers_is_constant() {
assert!(Expression::product(
Expression::Integer(1),
Expression::Integer(1)).is_constant());
}
#[test]
fn product_of_integer_and_symbol_is_not_constant() {
assert!(!Expression::product(
Expression::Symbol('x'),
Expression::Integer(1)).is_constant());
}
#[test]
fn quotient_of_integers_is_constant() {
assert!(Expression::quotient(
Expression::Integer(1),
Expression::Integer(1)).is_constant());
}
#[test]
fn quotient_of_integer_and_symbol_is_not_constant() {
assert!(!Expression::quotient(
Expression::Symbol('x'),
Expression::Integer(1)).is_constant());
}
#[test]
fn exponent_of_integers_is_constant() {
assert!(Expression::exponent(
Expression::Integer(1),
Expression::Integer(1)).is_constant());
}
#[test]
fn exponent_of_integer_and_symbol_is_not_constant() {
assert!(!Expression::exponent(
Expression::Symbol('x'),
Expression::Integer(1)).is_constant());
}
}
+2
View File
@@ -1,2 +1,4 @@
pub mod token;
pub mod expression;
pub mod lex;