5 个稳定版本
1.0.6 | 2024年2月10日 |
---|---|
1.0.2 | 2024年2月9日 |
1099 在 编程语言 中
29 每月下载量
24KB
388 行
表达式求解器
遵循优先级和结合性解决数学表达式。
该包提供了一个公共 API 函数。
fn resolve(input_string: String) -> Result<f64, String>
它将数学表达式作为 String 接收,并返回一个 Result 枚举,其中包含求解值或错误字符串。
示例
use expr_solver::resolve;
// simple binary expression.
resolve("2+2".to_string()); // Ok(2.0)
// follows precendence, 2 + (2 _ 2) and NOT (2 + 2) _ 2
resolve("2+2*2".to_string()); // Ok(6.0);
// unary expression.
resolve("-2".to_string()); // Ok(-2.0)
// even chain them. -(-2)
resolve("--2".to_string()); // Ok(2.0)
// binary and unary in one expression.
resolve("2+-2".to_string()); // Ok(0.0)
// gives syntax error.
resolve("2)2".to_string()); // Err(String);
内部工作原理
涉及三个步骤
1. 词法分析。
将输入字符串分解成单个令牌。
2. 解析器
它使用 Pratt 解析技术将令牌流解析为抽象语法树 (AST)。
3. 解释
使用 'Tree-Walk' 解释器评估 AST。
依赖项
~87KB