# 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.