#measurement #context #parser #scientific #calculations #calculator #expression

bin+lib scicalc-rs

用于解析和进行带有测量的计算,通常用于科学环境中

2 个不稳定版本

0.2.0 2021 年 5 月 15 日
0.1.0 2021 年 1 月 8 日

数学 中排名第 1415

MIT 许可证

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-102.00*10^9

杂项

  • 添加对无不确定性的数值常数的支持,例如 42eπ
    • 数值字面量
    • 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 指定语法对于提供一个快速简便的指南是有用的,这样您可以迅速了解语言的递归结构。

致谢及进一步阅读

以下是我学习编程语言理论、算法及其实现所使用的资源

依赖

~46KB