artifacts: add calculators/ — the 30 built calculators (5/variant) + machine-docs + git logs
This commit is contained in:
@ -0,0 +1,83 @@
|
||||
# REVIEW — phase parse
|
||||
|
||||
Adversary cold-verification log. Each gate: PASS or FAIL with evidence.
|
||||
|
||||
---
|
||||
|
||||
## D1: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
Cold-run: `python -c "from calc.lexer import tokenize; from calc.parser import parse; print(parse(tokenize('1+2*3')))"`
|
||||
|
||||
Output: `BinOp('PLUS', Num(1), BinOp('STAR', Num(2), Num(3)))` — matches expected exactly.
|
||||
|
||||
Adversarial probe: `2+3*4-1` → `BinOp('MINUS', BinOp('PLUS', Num(2), BinOp('STAR', Num(3), Num(4))), Num(1))` — correct.
|
||||
|
||||
---
|
||||
|
||||
## D2: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
Cold-run:
|
||||
- `8-3-2` → `BinOp('MINUS', BinOp('MINUS', Num(8), Num(3)), Num(2))` ✓
|
||||
- `8/4/2` → `BinOp('SLASH', BinOp('SLASH', Num(8), Num(4)), Num(2))` ✓
|
||||
|
||||
Both match expected. Left-fold `while` loops in `expr()` and `term()` confirmed correct.
|
||||
|
||||
---
|
||||
|
||||
## D3: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
Cold-run: `(1+2)*3` → `BinOp('STAR', BinOp('PLUS', Num(1), Num(2)), Num(3))` — matches expected.
|
||||
|
||||
Adversarial probe: `((5))` → `Num(5)` ✓. `()` raises `ParseError` ✓.
|
||||
|
||||
---
|
||||
|
||||
## D4: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
Cold-runs:
|
||||
- `-5` → `Unary('MINUS', Num(5))` ✓
|
||||
- `-(1+2)` → `Unary('MINUS', BinOp('PLUS', Num(1), Num(2)))` ✓
|
||||
- `3 * -2` → `BinOp('STAR', Num(3), Unary('MINUS', Num(2)))` ✓
|
||||
|
||||
Adversarial probes:
|
||||
- `--5` → `Unary('MINUS', Unary('MINUS', Num(5)))` ✓ (recursive unary works)
|
||||
- `-(-(3))` → `Unary('MINUS', Unary('MINUS', Num(3)))` ✓
|
||||
- `1 + -2 * -3` → `BinOp('PLUS', Num(1), BinOp('STAR', Unary('MINUS', Num(2)), Unary('MINUS', Num(3))))` ✓
|
||||
|
||||
---
|
||||
|
||||
## D5: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
All 5 cases raise `ParseError` (not any other exception type):
|
||||
- `'1 +'` → `ParseError: unexpected token 'EOF'` ✓
|
||||
- `'(1'` → `ParseError: expected ')', got 'EOF'` ✓
|
||||
- `'1 2'` → `ParseError: unexpected token 'NUMBER' after expression` ✓
|
||||
- `')('` → `ParseError: unexpected token 'RPAREN'` ✓
|
||||
- `''` → `ParseError: unexpected token 'EOF'` ✓
|
||||
|
||||
Adversarial probes:
|
||||
- `+5` → `ParseError: unexpected token 'PLUS'` ✓ (no unary plus — correct)
|
||||
- `1+2 3+4` → `ParseError: unexpected token 'NUMBER' after expression` ✓
|
||||
|
||||
---
|
||||
|
||||
## D6: PASS @2026-06-15T04:22:33Z
|
||||
|
||||
Cold-run: `python -m unittest -q`
|
||||
```
|
||||
Ran 39 tests in 0.001s
|
||||
OK
|
||||
```
|
||||
39 tests, 0 failures, 0 errors. ✓
|
||||
|
||||
---
|
||||
|
||||
## Observation (non-blocking)
|
||||
|
||||
STATUS claims "frozen `@dataclass`s" but nodes use bare `@dataclass` without `frozen=True` — they are mutable. Verified: `n = Num(5); n.value = 99` succeeds. This is not a DoD failure (the plan says "Represent nodes however you like"), but the evaluator should be aware nodes are mutable.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
All gates D1–D6: **PASS**. No vetoes. No defects blocking DONE.
|
||||
Reference in New Issue
Block a user