#math-expressions #expression #math-parser #expression-parser #rpn #calculator

bin+lib yarer

Yarer (另一种 Rust 表达式解析器) 是一个用于解析数学表达式的库。内部使用逆波兰算法。

1 个不稳定版本

0.1.7 2024年2月21日
0.1.6 2023年9月9日
0.1.5 2023年8月29日

#4 in #rpn

Download history 3/week @ 2024-03-13 10/week @ 2024-03-27 19/week @ 2024-04-03 279/week @ 2024-04-24 5/week @ 2024-05-01

每月59次下载

MIT/Apache

51KB
793

YARER - 数学表达式解析器

github build status crates.io docs.rs Downloads unsafe forbidden Project Status: Active – The project has reached a stable, usable state and is being actively developed.

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 开始,内部使用 BigIntnum 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