# Scicalc-rs
Rust crate for parsing and doing calculations with measurements, typically used in scientific contexts.
# TODO
## Lexing [OK]
Transform a string(i.e. the input as a sequence of characters) into a sequence of *tokens*, which can then be fed into the *parser*.
## Parsing [OK]
Read a sequence of tokens — which has a linear structure — and transform it into a **tree** structure.
## Evaluating [OK]
Read the tree structure of the expression and *fold* it, reducing it into it's final value.
## Proper error handling [WIP]
`don't panic!`
Instead of `panic!`ing, it'd better if the evaluator and the parser returned a `Result<...>`
## Calculator
- Parse and perform basic operations with measurements (**DONE**)
- For example, addition `(23.0 ± 0.1) + (1.5 ± 0.5)`
- Add support for:
- [x] Exponentiation
- [ ] Logarithms
- Add support for squareroots, n-th roots and many other functions
## Significant figures & Scientific notation
- Parse and verify if a measured quantity has the correct representation, i.e. with corresponding amount of significant figures
- Parse different kinds of scientific notation, such as `(23.0E+7 ± 1.0E6)`, `(2.00 ± 0.01)E-10` and `2.00*10^9`
## Miscellaneous
- Add support for numeric constants with no uncertainty, such as `42`, `e`, `π`, etc
- [x] Numeric literals
- [x] `e`
- [x] `π`
- [x] Add support for the plus-minus digraph('+-' for `±`)
# BNF grammar for the expressions
```
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