3 个稳定版本

1.0.2 2022年8月12日

#1492 in 解析器实现

Download history 10/week @ 2024-03-26 41/week @ 2024-04-02 2/week @ 2024-05-28 128/week @ 2024-06-04 73/week @ 2024-06-11 28/week @ 2024-06-18 27/week @ 2024-06-25

258 每月下载次数

MIT 许可证

155KB
3.5K SLoC

num_parser:数学解释器和评估器

crate license docs

num_parser 允许您轻松地将字符串解析为数学表达式并评估它们。

功能

  • 二元和一元运算符
  • 支持多种值类型
    • 布尔值,
    • 整数,
    • 浮点数,
    • 复数,
    • 向量
  • 内置函数
  • 内置常量
  • 用户定义函数f(x,y) = xsin(y)+ysin(x)
  • 用户定义变量a = pi/2b = 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 来让所有公共结构体推导出 SerializeDeserialize

[dependencies]
num = { version = "<version>", features = [ "serde_support" ] }

许可和贡献

num_parser 在 MIT 许可下授权。

请随意为我们提出的问题或想法打开问题或拉取请求。

依赖关系

~2MB
~37K SLoC