lexper/
lib.rs

1//! Simple expression evaluation crate with custom lexer and parser. Currently doesn't have support
2//! for a factorial, but this feature is in TODO list.
3//!
4//! ```
5//! # use lexper;
6//! let result = lexper::eval("sin(2) + 20^2").unwrap();
7//! assert_eq!(f64::round(result), 401.0);
8//! ```
9
10mod eval;
11pub(crate) mod lexer;
12mod r#macro;
13pub(crate) mod parser;
14
15pub mod error;
16pub(crate) use error::Result;
17
18pub use error::Error;
19pub use eval::Context;
20pub use lexer::{Lexer, OperatorType, Token, TokenType};
21pub use parser::{Expression, Parser};
22
23pub fn eval(expr: &str) -> Result<f64> {
24    let mut lexer = Lexer::new(expr.to_string());
25    lexer.lex()?;
26
27    let mut parser = Parser::new(lexer.tokens());
28    let result = parser.parse_expression(0)?;
29    let mut ctx = Context::new();
30    ctx.init();
31    ctx.eval(result)
32}