3 个稳定版本
1.0.2 | 2022年8月12日 |
---|
#1492 in 解析器实现
258 每月下载次数
155KB
3.5K SLoC
num_parser:数学解释器和评估器
num_parser 允许您轻松地将字符串解析为数学表达式并评估它们。
功能
- 二元和一元运算符
- 支持多种值类型
- 布尔值,
- 整数,
- 浮点数,
- 复数,
- 向量
- 内置函数
- 内置常量
- 用户定义函数:
f(x,y) = xsin(y)+ysin(x)
- 用户定义变量:
a = pi/2
或b = a+2
- 使用宏定义您自己的函数。
- 理解模糊语法,例如:
g(x) = pisinx
- 递归:
f(x) = branch(x<=2, 1, f(x-1)+f(x-2))
- 支持 Serde
- 无 panic
未来版本将实现更多功能!
使用指南
评估 简单的静态表达式
use num_parser::*;
assert_eq!(eval("2+2").unwrap(), Value::from(4));
assert_eq!(eval("sin(pi)").unwrap(), Value::from(0));
assert_eq!(eval("re(10+3i)").unwrap(), Value::from(10));
使用 上下文
use num_parser::*;
let mut context = Context::default();
// Declaring a function
let res = eval_with_mutable_context(
"f(x) = branch(x<=2, 1, f(x-1) + f(x-2))",
&mut context
).unwrap();
// Result is None
assert_eq!(res, None);
// Calling the function. We could just use eval_with_static_context at this point
let res = eval_with_mutable_context("f(10)", &mut context).unwrap();
assert_eq!(res, Some(Value::from(55)));
值
值 包含在 Value 枚举 中,该枚举提供了用于访问包含数据的实用函数
use num_parser::Value;
let value = Value::Float(1.0);
assert_eq!(value.as_bool().unwrap(), true);
assert_eq!(value.as_int().unwrap(), 1);
assert_eq!(value.as_float().unwrap(), 1.0);
assert_eq!(value.as_complex().unwrap(), num::complex::Complex::new(1.0, 0.0));
assert_eq!(value.as_vector(), vec![Value::Float(1.0)]);
// Assign type implicitly:
let implicit = Value::from(1.0);
assert_eq!(value, implicit);
请注意,虽然初始值是一个浮点数,但它已被 转换为 整数和布尔值。这是可能的,因为该值没有小数部分且为单个值。如果这些条件不满足,转换将失败。
运算符
二元 运算符
运算符 | 描述 | 优先级 |
---|---|---|
^ | 指数 | 90 |
/ | 除法 | 70 |
* | 乘法 | 70 |
% | 取模 | 70 |
+ | 求和 | 60 |
- | 减法 | 60 |
< | 小于 | 50 |
> | 大于 | 50 |
<= | 小于等于 | 50 |
>= | 大于等于 | 50 |
== | 等于 | 40 |
!= | 不等于 | 40 |
&& | 逻辑与 | 30 |
|| | 逻辑或 | 20 |
, | 聚合。创建向量 | 10 |
= | 赋值。用于函数和变量声明 | 0 |
一元 运算符
运算符 | 描述 | 优先级 |
---|---|---|
! | 逻辑非 | 80 |
- | 否定 | 60 |
函数
函数 | 参数数量 | 描述 |
---|---|---|
min |
>=1 | 返回最小值。 |
max |
>=1 | 返回最大值。 |
floor |
1 | 返回最大的整数。 |
ceil |
1 | 返回最小的整数。 |
round |
1 | 返回四舍五入的整数。 |
ln |
1 | 返回数的自然对数。 |
log |
2 (基数,参数) | 返回指定基数的对数。 |
exp |
1 | 返回 e^(参数)。 |
rand |
2 (最小值,最大值) | 返回两个指定数之间的随机浮点数。 |
abs |
1 | 返回数的绝对值。 |
sqrt |
1 | 返回数的平方根。 |
branch |
3 (条件,true,false) | 如果条件为真,则返回第二个参数;如果为假,则返回第三个参数。 |
sin |
1 | 返回角度的正弦值。 |
cos |
1 | 返回角度的余弦值。 |
tan |
1 | 返回角度的正切值。 |
asin |
1 | 返回角度的反正弦值。 |
acos |
1 | 返回角度的反余弦值。 |
atan |
1 | 返回角度的反正切值。 |
sinh |
1 | 返回角度的双曲正弦值。 |
cosh |
1 | 返回角度的双曲余弦值。 |
tanh |
1 | 返回角度的双曲正切值。 |
asinh |
1 | 返回角度的双曲反正弦值。 |
acosh |
1 | 返回角度的双曲反余弦值。 |
atanh |
1 | 返回角度的双曲反正切值。 |
re |
1 | 返回数的自然部分。 |
im |
1 | 返回数的虚部。 |
polar |
1 | 返回复数的极坐标形式 (r, theta)。 |
arg |
1 | 返回数的主值。 |
norm |
1 | 返回向量 (re, im) 的长度。 |
上下文
上下文 允许您跟踪 用户定义的函数 和 变量,以及设置。它们可以创建如下所示
use num_parser::*;
// Generate the default context
let mut default = Context::default();
// Generate a custom context
let mut custom = Context::new(
settings::Rounding::NoRounding,
settings::AngleUnit::Degree,
settings::DepthLimit::NoLimit
);
Serde
您可以使用可选功能 serde_support
来让所有公共结构体推导出 Serialize
和 Deserialize
。
[dependencies]
num = { version = "<version>", features = [ "serde_support" ] }
许可和贡献
num_parser 在 MIT 许可下授权。
请随意为我们提出的问题或想法打开问题或拉取请求。
依赖关系
~2MB
~37K SLoC