2 个版本
0.1.2 | 2023 年 11 月 14 日 |
---|---|
0.1.1 | 2023 年 11 月 14 日 |
#1558 在 数学
12KB
182 行
arithmetic_parser_smetaniuk
算术表达式计算解析器。
描述
此解析器可用于解析和计算算术表达式,包括加法 (+)、减法 (-)、乘法 (*)、除法 (/) 和使用操作符的括号。
crates.io 链接
https://crates.io/crates/arithmetic_parser_smetaniuk
规则描述
// 这条规则描述了一个有效数字,可以是整数或小数。
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 函数接收一个令牌序列作为输入,并将其解析为表示表达式的抽象语法树。它使用在 lazy_static 块中初始化的 PrattParser 来完成此操作。PrattParser 处理操作符的顺序并相应地构建表达式树。
表达式解析后,eval_expr 函数评估由抽象语法树表示的表达式并返回结果。这包括递归评估子表达式并执行适当的算术运算。
总的来说,此代码允许您通过首先将它们转换为结构化形式,然后计算它们的值来解析和评估算术表达式。
依赖关系
~4MB
~77K SLoC