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
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 读取中缀表示法的运算符优先级相当常见。以下是按降序排列的运算符
- 单一
+
、单一-
、单一!
×
、/
、%
、//
- 二元
+
、二元-
<<
,>>
&
^
|
当存在多个运算符执行同一操作时,它们的优先级相同。
使用解析表达式
解析形式
解析表达式可以被转换为库用户进一步处理的可用的解析形式。该表达式可以通过 .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计算作为命令行参数提供的数学表达式的简单程序。