2 个不稳定版本
0.2.0 | 2021 年 5 月 15 日 |
---|---|
0.1.0 | 2021 年 1 月 8 日 |
在 数学 中排名第 1415
41KB
1K SLoC
Scicalc-rs
Scicalc-rs 是一个 Rust crate,用于解析和进行带有测量的计算,通常用于科学环境中。
待办事项
词法分析 [完成]
将字符串(即输入作为字符序列)转换为一个 令牌 序列,然后将其输入到 解析器 中。
解析 [完成]
读取一个令牌序列——它具有线性结构——并将其转换为 树 结构。
评估 [完成]
读取表达式的树结构并 折叠 它,将其归约为其最终值。
适当的错误处理 [进行中]
不使用panic!!
而不是 panic!
,最好让评估器和解析器返回一个 Result<...>
计算器
-
解析并使用测量执行基本操作(完成)
- 例如,加法
(23.0 ± 0.1) + (1.5 ± 0.5)
- 例如,加法
-
添加支持
-
指数
-
对数
-
添加对平方根、n 次方根和其他许多函数的支持
有效数字 & 科学记数法
- 解析并验证测量的量是否具有正确的表示,即具有相应的有效数字数量
- 解析不同类型的科学记数法,例如
(23.0E+7 ± 1.0E6)
,(2.00 ± 0.01)E-10
和2.00*10^9
杂项
- 添加对无不确定性的数值常数的支持,例如
42
,e
,π
等- 数值字面量
-
e
-
π
- 添加对加减符号图('+-' 代表
±
)的支持
表达式的 BNF 语法
Expression ::= Value | UnaryExpression | BinaryExpression | Grouping
Grouping ::= "(" Expression ")"
Value ::= Constant | Number | Measurement
Measurement ::= Number "±" PosNumber
Number ::= PosNumber | UnaryMinus PosNumber
PosNumber ::= (\d+)(\.\d+)?|(\.\d+)
Constant ::= "e" | "π"
BinaryExpression ::= Expression BinaryOperator Expression
UnaryExpression ::= UnaryOperator Expression
BinaryOperator ::= "+" | "-" | "*" | "/" | "^"
UnaryOperator ::= UnaryMinus
UnaryMinus ::= "-"
注意:根据 Pratt 关于 "自顶向下运算符优先级" 的论文 观察到的,巴科斯-诺尔范式(BNF 是其简称)非常不适合捕捉中缀运算符的优先级。即便如此,我仍然认为使用 BNF 指定语法对于提供一个快速简便的指南是有用的,这样您可以迅速了解语言的递归结构。
致谢及进一步阅读
以下是我学习编程语言理论、算法及其实现所使用的资源
-
递归下降解析简介,由 Ryan Flannery 撰写
-
Crafting Interpreters,由 Bob Nystrom 撰写
-
Pratt 解析和优先级提升是相同的算法,由 Oilshell 撰写
-
编程语言理论,由 Steven Shaw 维护的关于 PLT 的资源列表
-
简单但强大的 Pratt 解析,由 Aleksey Kladov(matklad) 撰写
依赖
~46KB