You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.6 KiB
Rust

/// This is the main command-line application for arithmetic expression evaluator
// Standard library
use std::io;
// code for arithmetic expression evaluation is in parsemath module
mod parsemath;
use parsemath::ast;
use parsemath::parser::{ParseError, Parser};
// Function to invoke Parser and evaluate expression
fn evaluate(expr: String) -> Result<f64, ParseError> {
let expr = expr.split_whitespace().collect::<String>(); // remove whitespace chars
let mut math_parser = Parser::new(&expr)?;
let ast = math_parser.parse()?;
println!("The generated AST is {:?}", ast);
Ok(ast::eval(ast)?)
}
// Main function reads aritnmetic expression from command-line and displays result and error.
// It calls the evaluate function to perform computation.
fn main() {
println!("Hello! Welcome to Arithmetic expression evaluator.");
println!("You can calculate value for expression such as 2*3+(4-5)+2^3/4. ");
println!("Allowed numbers: positive, negative and decimals.");
println!("Supported operations: Add, Subtract, Multiply, Divide, PowerOf(^). ");
println!("Enter your arithmetic expression below:");
loop {
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(_) => {
match evaluate(input) {
Ok(val) => println!("The computed number is {}\n", val),
Err(_) => {
println!("Error in evaluating expression. Please enter valid expression\n");
}
};
}
Err(error) => println!("error: {}", error),
}
}
}