feat(eval): add extremely basic evaluation

added a basic `eval_expr` function that evaluates an expression.
it still does not reduce/simplify anything, and it cannot evaluate to fractions yet
This commit is contained in:
ozzy committed 2026-09-26 14:51:33 -05:00
1 parent b68b1db2f6
commit 234b2ef2dc
4 files changed
+44 -2

No files matched your search

+1 -1
View File
@@ -4,4 +4,4 @@ version = "0.1.0"
edition = "2024"
[dependencies]
rust_decimal = { version = "1.43.0", features = ["macros"] }
rust_decimal = { version = "1.43.0", features = ["macros", "maths"] }
+1 -1
View File
@@ -13,7 +13,7 @@ fn main() -> io::Result<()> {
let line = line.unwrap();
let parsed = math::parse(line.trim());
println!("{}", parsed);
println!("{}", math::eval(parsed));
prompt()?;
}
+37
View File
@@ -0,0 +1,37 @@
use rust_decimal::MathematicalOps;
use crate::math::types::{Expression, Operator};
pub fn eval_expr(expr: Expression) -> Expression {
match expr {
Expression::Number(_) => expr,
Expression::Variable(_) => expr,
Expression::Fraction(numberator, denominator) => {
// TODO: implement proper fraction handling
eval_expr(Expression::Operation(
Operator::Divide,
numberator,
denominator,
))
}
Expression::Operation(operator, left, right) => eval_operation(operator, *left, *right),
Expression::Function(_name, _params) => todo!(),
}
}
fn eval_operation(operator: Operator, left: Expression, right: Expression) -> Expression {
let left = eval_expr(left);
let right = eval_expr(right);
match (&left, &right) {
(Expression::Number(left), Expression::Number(right)) => match operator {
Operator::Add => Expression::Number(left + right),
Operator::Subtract => Expression::Number(left - right),
Operator::Multiply => Expression::Number(left * right),
Operator::Divide => Expression::Number(left / right),
Operator::Modulo => Expression::Number(left % right),
Operator::Power => Expression::Number(left.powd(*right)),
},
// TODO: implement handling for variables
_ => Expression::Operation(operator, Box::new(left), Box::new(right)),
}
}
+5
View File
@@ -1,6 +1,7 @@
use crate::math::types::Expression;
mod display;
mod eval;
mod lexer;
mod parser;
@@ -11,3 +12,7 @@ pub fn parse(source: &str) -> Expression {
let mut parser = parser::from(lexer.collect());
parser.parse()
}
pub fn eval(expr: Expression) -> Expression {
eval::eval_expr(expr)
}