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:
4 files changed
+44
-2
No files matched your search
+1
-1
@@ -4,4 +4,4 @@ version = "0.1.0"
|
|||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rust_decimal = { version = "1.43.0", features = ["macros"] }
|
rust_decimal = { version = "1.43.0", features = ["macros", "maths"] }
|
||||||
+1
-1
@@ -13,7 +13,7 @@ fn main() -> io::Result<()> {
|
|||||||
|
|
||||||
let line = line.unwrap();
|
let line = line.unwrap();
|
||||||
let parsed = math::parse(line.trim());
|
let parsed = math::parse(line.trim());
|
||||||
println!("{}", parsed);
|
println!("{}", math::eval(parsed));
|
||||||
|
|
||||||
prompt()?;
|
prompt()?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
use crate::math::types::Expression;
|
use crate::math::types::Expression;
|
||||||
|
|
||||||
mod display;
|
mod display;
|
||||||
|
mod eval;
|
||||||
mod lexer;
|
mod lexer;
|
||||||
mod parser;
|
mod parser;
|
||||||
|
|
||||||
@@ -11,3 +12,7 @@ pub fn parse(source: &str) -> Expression {
|
|||||||
let mut parser = parser::from(lexer.collect());
|
let mut parser = parser::from(lexer.collect());
|
||||||
parser.parse()
|
parser.parse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn eval(expr: Expression) -> Expression {
|
||||||
|
eval::eval_expr(expr)
|
||||||
|
}
|
||||||
Reference in new issue
Block a user