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