10 个版本
| 0.1.9 | 2022 年 3 月 16 日 |
|---|---|
| 0.1.8 | 2022 年 2 月 28 日 |
#298 在 解析工具
每月 21 次下载
345KB
8K SLoC
Prexel
数学表达式的求值器。
用法
[dependencies]
prexel = "0.1.0"
示例
您可以使用 Evaluator<N> 来求值一个表达式。
fn main(){
let evaluator: Evaluator<f64> = Evaluator::new();
println!("{:?}", evaluator.eval("2 + 3 * 5"));
}
警告
此库可能不稳定,并且可能会在任意时间发生破坏性更改。
实现
求值每个表达式的步骤有 3 个
-
分词:将字符串转换为标记数组。
-
转换:使用 Shunting Yard 算法 将标记数组从中缀转换为后缀表示法。
-
求值:评估得到的 RPN (逆波兰表示法) 表达式。
这使用 Tokenizer、Evaluator 和 Context 完成。 Tokenizer 将 str 转换为 Token,而 Evaluator 处理并评估标记。
Context 是存储用于评估的所有函数、变量、常量和附加信息的地方。您可以使用 DefaultContext 提供的实现。
精度
在 prexel::ops::math 中实现的一些数学函数(如三角函数)在内部使用 f64 进行计算,并使用 FromPrimitive 和 ToPrimitive 特性,可能会导致精度错误。
如果您需要更高的精度,请使用 decimal 功能启用 128 位十进制数。
use prexel::context::DefaultContext;
use prexel::evaluator::Evaluator;
fn main(){
let context = DefaultContext::new_decimal();
let evaluator = Evaluator::with_context(context);
println!("{:?}", evaluator.eval("Cos(180) * 10!"));
}
依赖项
~0.6–1.1MB
~21K SLoC