artifacts: add calculators/ — the 30 built calculators (5/variant) + machine-docs + git logs
This commit is contained in:
@ -0,0 +1,74 @@
|
||||
# REVIEW — phase `parse`
|
||||
|
||||
## Verdict
|
||||
|
||||
review(D1-D6): PASS — all six gates verified cold at a05812d
|
||||
|
||||
---
|
||||
|
||||
## D1: PASS @2026-06-15T02:10Z
|
||||
|
||||
Precedence correct: `*`/`/` bind tighter than `+`/`-` via two-level grammar (`expr` → `_term` → `_unary` → `_primary`).
|
||||
|
||||
```
|
||||
parse(tokenize('1+2*3')) => BinOp('+', Num(1), BinOp('*', Num(2), Num(3))) ✓
|
||||
parse(tokenize('2*3+1')) => BinOp('+', BinOp('*', Num(2), Num(3)), Num(1)) ✓
|
||||
parse(tokenize('9-4/2')) => BinOp('-', Num(9), BinOp('/', Num(4), Num(2))) ✓
|
||||
```
|
||||
|
||||
## D2: PASS @2026-06-15T02:10Z
|
||||
|
||||
Left associativity correct: while-loops in `expr()` and `_term()` accumulate left-to-right.
|
||||
|
||||
```
|
||||
parse(tokenize('8-3-2')) => BinOp('-', BinOp('-', Num(8), Num(3)), Num(2)) ✓
|
||||
parse(tokenize('8/4/2')) => BinOp('/', BinOp('/', Num(8), Num(4)), Num(2)) ✓
|
||||
parse(tokenize('1+2+3')) => BinOp('+', BinOp('+', Num(1), Num(2)), Num(3)) ✓
|
||||
```
|
||||
|
||||
## D3: PASS @2026-06-15T02:10Z
|
||||
|
||||
Parentheses override precedence via `_primary()` grouping.
|
||||
|
||||
```
|
||||
parse(tokenize('(1+2)*3')) => BinOp('*', BinOp('+', Num(1), Num(2)), Num(3)) ✓
|
||||
parse(tokenize('((2+3))')) => BinOp('+', Num(2), Num(3)) ✓
|
||||
```
|
||||
|
||||
## D4: PASS @2026-06-15T02:10Z
|
||||
|
||||
Unary minus handled at `_unary()`, right-recursive, correct for all cases including nested and post-operator.
|
||||
|
||||
```
|
||||
parse(tokenize('-5')) => Unary('-', Num(5)) ✓
|
||||
parse(tokenize('-(1+2)')) => Unary('-', BinOp('+', Num(1), Num(2))) ✓
|
||||
parse(tokenize('3 * -2')) => BinOp('*', Num(3), Unary('-', Num(2))) ✓
|
||||
parse(tokenize('--5')) => Unary('-', Unary('-', Num(5))) ✓
|
||||
parse(tokenize('---5')) => Unary('-', Unary('-', Unary('-', Num(5)))) ✓
|
||||
parse(tokenize('-(1+2)*3')) => BinOp('*', Unary('-', BinOp('+', Num(1), Num(2))), Num(3)) ✓
|
||||
```
|
||||
|
||||
## D5: PASS @2026-06-15T02:10Z
|
||||
|
||||
All five required error cases raise `ParseError` (not any other exception). Adversarial extras also raise correctly.
|
||||
|
||||
```
|
||||
'1 +' => ParseError ✓
|
||||
'(1' => ParseError ✓
|
||||
'1 2' => ParseError ✓
|
||||
')(' => ParseError ✓
|
||||
'' => ParseError ✓
|
||||
# additional probes:
|
||||
'*5' => ParseError ✓
|
||||
'()' => ParseError ✓
|
||||
'+' => ParseError ✓
|
||||
'1+2)' => ParseError ✓
|
||||
```
|
||||
|
||||
## D6: PASS @2026-06-15T02:10Z
|
||||
|
||||
`python -m unittest -q` → 30 tests, 0 failures, 0 errors.
|
||||
|
||||
---
|
||||
|
||||
Gates to verify: D1 D2 D3 D4 D5 D6 — all PASS.
|
||||
Reference in New Issue
Block a user