#math-expressions #math-parser #operator #parse-error #expression-parser #string #compute

bin+lib math-parse

用于计算以字符串形式给出的数学表达式的库

7 个版本 (3 个稳定版)

1.0.2 2024年1月8日
0.4.0 2023年10月11日
0.3.0 2023年10月11日
0.2.0 2023年10月9日
0.1.0 2023年10月8日

#753解析器实现

每月22 次下载
用于 macro-asm-builder

BSD-3-Clause

72KB
1.5K SLoC

Math-Parse

一个强大而多功能的库,用于解析或计算数学表达式。

Math-Parse 考虑了健壮性。与其他 Rust 数学解析库不同,Math-Parse 可以处理任意大的输入而不发生栈溢出。进行了大量的测试用例,以确保程序永远不会崩溃,而是使用自定义错误类型报告错误。

使用示例

let num1: i64 = MathParse::parse("(1+2)*3").unwrap().solve_int(None).unwrap();
println!("{num1}"); // Prints 9

let num2: f64 = MathParse::parse("5/8+6").unwrap().solve_float(None).unwrap();
println!("{num2}"); // Prints 6.625

let parsed = MathParse::parse("(2+3)*2/5").unwrap().to_tree();
println!("{parsed}"); // Prints (((2 + 3) * 2) / 5)

API

解析表达式

要解析表达式,请使用 MathParse 对象。您可以使用 MathParse::parse 以通常的逆序表示法解析表达式,并使用 MathParse::parse_rpn 以逆波兰表示法解析表达式。

可用运算符

以下运算符可用

  • +:用作加法的二元运算符。也可以用作无效果的单一运算符。
  • -:用作减法的二元运算符,并作为用于取负数的单一运算符。
  • *×·:乘法的二元运算符。
  • /÷:除法的二元运算符。
  • %:二进制运算符,用于获取整数除法的余数。
  • //:用于整数除法的二进制运算符。
  • !~:用于位非操作的单一运算符。
  • &:用于位与操作的二进制运算符。
  • ^:用于位异或操作的二进制运算符。
  • |:用于位或操作的二进制运算符。
  • <<:向左逻辑移位的二进制运算符。
  • >>:向右逻辑移位的二进制运算符。

运算符优先级

Math-Parse 读取中缀表示法的运算符优先级相当常见。以下是按降序排列的运算符

  1. 单一 +、单一 -、单一 !
  2. ×/%//
  3. 二元 +、二元 -
  4. <<, >>
  5. &
  6. ^
  7. |

当存在多个运算符执行同一操作时,它们的优先级相同。

使用解析表达式

解析形式

解析表达式可以被转换为库用户进一步处理的可用的解析形式。该表达式可以通过 .to_tree() 方法表示为树形结构,或通过 .to_rpn() 方法表示为一个逆波兰运算符的向量。

求解

解析对象具有计算其结果的功能,.solve_int.solve_float。这两个函数都接受一个 &str 作为第一个参数,这是一个数学表达式,以及一个可选的命名变量映射作为第二个参数。

这两个函数如果计算可以完成,则返回 Ok(num),其中 num 对于 math_parse_int 是一个 i64,对于 math_parse_float 是一个 f64。如果计算不能完成,它们返回 Err(err),其中 err 是一个 MathParseErrors。类型 MathParseErrors 实现了 Display 特性,它可以格式化成人类可读的错误消息。

或者,还有 .solve_auto 方法,它尝试给出一个 i64 结果,但可以回退到 f64 结果。

命名变量

Math-Parse的求解函数的参数是一个命名变量的映射。它是一个可选的字符串到字符串的哈希映射,可以将数学表达式中的命名变量映射到它们的值。下面是一个使用示例

let variables = HashMap::from([
    ("a".to_string(), "1".to_string()),
    ("b".to_string(), "3*3".to_string()),
]);
let result = MathParse::parse("a+b").unwrap().solve_int(Some(&variables)).unwrap();
println!("{result}"); // Prints 10

如您所见,映射中的值是数学表达式(b 等于 3*3)。这使得映射非常强大。但由于扩展不是递归进行的,命名变量的值不能包含其他命名变量。

其他事项。

还暴露了一个额外的函数contains_math_char。这个函数接受一个字符串作为参数,如果它包含Math-Parse认为的操作符的任何字符,则返回true。它是为了净化Math-Parse周围使用的数据。

查看文档获取更多信息。

示例程序

您可以在本存储库中找到src/example.rs,这是一个使用Math-Parse计算作为命令行参数提供的数学表达式的简单程序。

无运行时依赖