# STATUS — Phase `lex` (Builder) ## DONE All gates D1, D2, D3, D4 verified PASS by Adversary @2026-06-15T04:02Z. Phase `lex` complete. ## Current State Gates D1, D2, D3, D4: Adversary-verified PASS. ## Gate Claims ### D1 — Numbers **WHAT:** `tokenize("42")` → `[NUMBER(42), EOF]`; integers return int, floats return float. **HOW:** `python -c "from calc.lexer import tokenize; print([(t.kind,t.value) for t in tokenize('42')]); print(type(tokenize('42')[0].value))"` **EXPECTED:** `[('NUMBER', 42), ('EOF', None)]` then `` **WHERE:** `calc/lexer.py` commit to be pushed; `calc/test_lexer.py` class `TestNumbers` ### D2 — Operators & Parens **WHAT:** `+ - * / ( )` each tokenize to the right kind; `tokenize("1+2*3")` yields NUMBER PLUS NUMBER STAR NUMBER EOF. **HOW:** `python -c "from calc.lexer import tokenize; print([t.kind for t in tokenize('1+2*3')])"` **EXPECTED:** `['NUMBER', 'PLUS', 'NUMBER', 'STAR', 'NUMBER', 'EOF']` **WHERE:** `calc/lexer.py`; `calc/test_lexer.py` class `TestOperatorsAndParens` ### D3 — Whitespace & Errors **WHAT:** Spaces/tabs skipped; invalid chars raise `LexError` with offending char and position. **HOW:** ```bash python -c "from calc.lexer import tokenize; print([t.kind for t in tokenize(' 12 + 3 ')])" python -c "from calc.lexer import tokenize; tokenize('1 @ 2')" ``` **EXPECTED:** First: `['NUMBER', 'PLUS', 'NUMBER', 'EOF']`. Second: raises `calc.lexer.LexError: unexpected character '@' at position 2` **WHERE:** `calc/lexer.py`; `calc/test_lexer.py` class `TestWhitespaceAndErrors` ### D4 — Tests Green **WHAT:** `python -m unittest -q` passes 21 tests, 0 failures. **HOW:** `python -m unittest -q` (run from repo root) **EXPECTED:** `Ran 21 tests in ...s\n\nOK` **WHERE:** `calc/test_lexer.py` ## Cold-verify commands (from plan) ```bash python -m unittest -q python -c "from calc.lexer import tokenize; print([(t.kind,t.value) for t in tokenize('3.5*(1-2)')])" python -c "from calc.lexer import tokenize; tokenize('1 @ 2')" ``` **Expected outputs:** 1. `Ran 21 tests in ...s\n\nOK` 2. `[('NUMBER', 3.5), ('STAR', '*'), ('LPAREN', '('), ('NUMBER', 1), ('MINUS', '-'), ('NUMBER', 2), ('RPAREN', ')'), ('EOF', None)]` 3. `calc.lexer.LexError: unexpected character '@' at position 2` (raises, exits non-zero)