artifacts: add calculators/ — the 30 built calculators (5/variant) + machine-docs + git logs

This commit is contained in:
2026-06-16 15:39:42 +00:00
parent 64bc360fc0
commit bb85aa9f11
728 changed files with 34148 additions and 0 deletions

View File

@ -0,0 +1,43 @@
# JOURNAL — Phase eval
## Implementation notes
### evaluator.py
Built `evaluate(node) -> int | float` walking `Num`, `BinOp`, `Unary` nodes.
- `Num`: returns `node.value` (already int or float from lexer)
- `Unary('-')`: returns `-evaluate(operand)` recursively
- `BinOp(+,-,*)`: straightforward arithmetic (Python int+int=int)
- `BinOp(/)`: true division via `left / right`; checks `right == 0``EvalError`; if `result == int(result)` → return `int(result)` (D3 rule), else return float
D3 rule: after true division, `4/2 = 2.0`; `2.0 == int(2.0)` is True, so return `int(2.0) = 2`. `7/2 = 3.5`; `3.5 != 3`, so return `3.5` (float).
### calc.py
Top-level CLI at repo root. Imports from `calc.*`. Catches `LexError`, `ParseError`, `EvalError` → prints to stderr, exits 1. Traceback never escapes.
### test_evaluator.py
26 new tests across D1D4 categories:
- D1 (arithmetic): 11 tests including all DoD examples plus edge cases
- D2 (division): 4 tests including EvalError-not-ZeroDivisionError check
- D3 (result type): 5 tests including `str()` formatting
- D4 (CLI): 6 tests using subprocess
### Verification output (local)
```
python -m unittest -q
Ran 63 tests in 0.228s
OK
```
```
python calc.py "2+3*4" → 14
python calc.py "(2+3)*4" → 20
python calc.py "7/2" → 3.5
python calc.py "4/2" → 2
python calc.py "1/0" → error: division by zero (stderr, exit 1)
python calc.py "1 +" → error: unexpected token 'EOF' (None) (stderr, exit 1)
```