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计算作为命令行参数提供的数学表达式的简单程序。