1 个不稳定版本
0.1.2 | 2023年11月15日 |
---|
#1340 in 数学
13KB
188 行
arithmetic_parser
算术表达式计算解析器。
描述
此解析器可用于解析和计算算术表达式,包括加法 (+)、减法 (-)、乘法 (*)、除法 (/) 和使用操作符的括号。
crates.io 链接
https://crates.io/crates/arithmetic_parser
规则描述
// 此规则描述了一个有效的数字,可以是整数或小数。
number = @{
("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*)
~ ("." ~ ASCII_DIGIT*)?
}
// 此规则表示一元减号运算符。
unary_minus = { "-" }
// 此规则表示主要表达式,可以是数字或括号内的表达式。
primary = _{ number | "(" ~ expr ~ ")" }
// 此规则表示原子,可以是带有可选一元减号的主要表达式。
atom = _{ unary_minus? ~ primary }
// 此规则表示二元运算符,包括加、减、乘和除。
bin_op = _{ add | subtract | multiply | divide }
add = { "+" }
subtract = { "-" }
multiply = { "*" }
divide = { "/" }
// 此规则表示整体表达式,由原子和二元运算符组成。
expr = { atom ~ (bin_op ~ atom)* }
// 此规则表示方程,以特定标记开始和结束,中间有表达式。
equation = _{ SOI ~ expr ~ EOI }
// 此规则定义空白为一个空格字符。
WHITESPACE = _{ " " }
启动
要在控制台模式下运行 parset,请在命令提示符中运行以下命令。
make pretty run_console
要在文件计算模式下运行 parset,请在命令提示符中运行以下命令。
make pretty run_file file=<your_file_path_here>
流程
代码定义了一个使用 Pratt 解析算法的算术表达式解析器。
parse_expr 函数接受一个令牌序列作为输入,并将其解析为一个表示表达式的抽象语法树。它使用 PrattParser 来完成此操作,该解析器在 lazy_static 块中初始化。PrattParser 处理运算符的顺序并相应地构建表达式树。
表达式解析后,eval_expr 函数评估由抽象语法树表示的表达式并返回结果。这包括递归评估子表达式并执行适当的算术运算。
总的来说,此代码允许您通过首先将它们转换为结构化形式然后计算它们的值来解析和评估算术表达式。
依赖关系
~4MB
~77K SLoC