1 个不稳定版本
0.1.7 | 2024年2月21日 |
---|---|
0.1.6 |
|
0.1.5 |
|
#4 in #rpn
每月59次下载
51KB
793 行
YARER - 数学表达式解析器
Yarer (另一种 Rust 表达式解析器) 是一个用于解析数学表达式的库。内部使用逆波兰算法。
库使用示例
let session = Session::init();
let mut resolver = session.process("1+2"); // or even "(cos(10+e)+3*sin(9/pi))^2"
println!("The result is {}", resolver.resolve());
只需要从会话中获取一个新的 'resolver' 实例,并将要分析的表达式传递给它。该库将返回一个自然数变体,或者如果表达式中存在小数(即 '2.1+1' 或存在三角函数(即 1/cos(x+1))时,则返回一个小数。
Yarer 可以处理变量和函数。以下是一个示例
let session = Session::init();
let mut resolver = session.process("1/cos(x^2)");
session.set("x",1);
println!("The result is {}", resolver.resolve());
当然,如果变量发生变化,表达式可以重新评估。
//...
session.set("x",-1);
println!("The result is {}", resolver.resolve());
session.set("x",0.001);
println!("The result is {}", resolver.resolve());
//...
结果可以简单地转换为 i32 或 f64(如果为小数)
let result: Number = resolver.resolve().unwrap();
let int : i32 = result.into();
// or
let float : f64 = result.into();
Yarer 也可以从命令行使用,其行为与 GNU bc 非常相似
$ yarer
Yarer v.0.1.1 - Yet Another Rust Expression Resolver.
License MIT OR Apache-2.0
> (1+9)*(8+2)+0!
101
> (1./2)+atan(10)
1.1483608274590869
> x=10
> 3/sin(5*x^2)
-6.41338354698791
> ln(1)
0
> log(10)
1
> -2^-2
0.25
> 1/(log(10)+cos(0))^-2
4
> 4.5+7.9*2.2
21.88
> 9801/(2206*sqrt(2)) // approx of PI
3.1415927300133055
新闻和更新
从 Yarer 版本 0.1.7 开始,内部使用 BigInt 从 num crate 实现。现在可以执行任意大的自然数计算。
$ yarer
Yarer v.0.1.1 - Yet Another Rust Expression Resolver.
License MIT OR Apache-2.0
> 78!
1132428117820629783145752115873204622873174957948825.....
> 2^78
302231454903657293676544
从 Yarer 版本 0.1.5 开始,可以共享单个会话,因此可以共享单个变量堆,用于多个解析器。该库不是线程安全的。
let session = Session::init();
let mut res = session.process("x ^ 2");
let mut res2 = session.process("x! - (x-1)!");
session.set("x", 10);
if let (Ok(a), Ok(b)) = (res.resolve(),res2.resolve()) {
println!("{} {}", a, b); // 100 3265920
}
内置定义的函数
定义了几个数学函数,您可以在表达式中使用。更多功能将陆续推出!在 集成测试文件 中有许多已处理表达式的示例。
Sin
Cos
Tan
ASin
ACos
ATan
Ln
Log
Abs
Sqrt
内置定义的常量
目前有 2 个预定义的数学常量
PI -> 3.14159265...
e -> 2.7182818...
执行
要从 cargo 运行它,只需键入
cargo run -q --
要记录调试信息,只需运行
env RUST_LOG=yarer=debug cargo run -q --
或从代码构建和安装版本
cargo build --release
cargo install --path .
./target/release/yarer
内部实现
每个表达式都是以下角色的评估结果
步骤1 - 解析器:字符串被“正则表达式化”并转换为令牌数组。
步骤 2 - RpnResolver:使用Shunting Yard算法,将标记数组从中缀表示转换为后缀表示。
步骤 3 - RpnResolver:对生成的RPN(逆波兰表示法)表达式进行评估。
值得一提的是,会话负责存储所有由所有RpnResolvers借用的变量(和常数)。
贡献
除了稳定外,Yarer还在不断进步。如果您对功能(例如,要实现更多数学函数)有任何建议,或者如果您在代码、设计、界面等中发现任何问题,请随时在我们GitHub上分享。
非常感谢您的反馈!
依赖项
约10MB
约188K SLoC