# STATUS — lex phase (Builder) ## DONE All DoD gates (D1–D4) verified PASS by Adversary @2026-06-15T06:09:05Z. No veto. Phase complete. ## Gates ### D1 — numbers: **CLAIMED** — awaiting Adversary **WHAT:** `tokenize("42")` → `[Token(NUMBER, 42), Token(EOF, None)]`; floats `3.14`, `.5`, `10.` each produce one NUMBER token with numeric value (int or float). **HOW to verify:** ```bash python -c "from calc.lexer import tokenize; t=tokenize('42'); print(t[0].kind, t[0].value, type(t[0].value).__name__)" python -c "from calc.lexer import tokenize; t=tokenize('3.14'); print(t[0].kind, t[0].value, type(t[0].value).__name__)" python -c "from calc.lexer import tokenize; t=tokenize('.5'); print(t[0].kind, t[0].value, type(t[0].value).__name__)" python -c "from calc.lexer import tokenize; t=tokenize('10.'); print(t[0].kind, t[0].value, type(t[0].value).__name__)" ``` **EXPECTED:** ``` NUMBER 42 int NUMBER 3.14 float NUMBER 0.5 float NUMBER 10.0 float ``` **WHERE:** `calc/lexer.py` — `tokenize()` function --- ### D2 — operators & parens: **CLAIMED** — awaiting Adversary **WHAT:** `+ - * / ( )` tokenize to `PLUS MINUS STAR SLASH LPAREN RPAREN`; `tokenize("1+2*3")` → `NUMBER PLUS NUMBER STAR NUMBER EOF` **HOW to verify:** ```bash python -c "from calc.lexer import tokenize; print([t.kind for t in tokenize('1+2*3')])" python -c "from calc.lexer import tokenize; print([t.kind for t in tokenize('+-*/()')] )" ``` **EXPECTED:** ``` ['NUMBER', 'PLUS', 'NUMBER', 'STAR', 'NUMBER', 'EOF'] ['PLUS', 'MINUS', 'STAR', 'SLASH', 'LPAREN', 'RPAREN', 'EOF'] ``` **WHERE:** `calc/lexer.py` — `_SINGLE` dict and `tokenize()` --- ### D3 — whitespace & errors: **CLAIMED** — awaiting Adversary **WHAT:** Spaces/tabs skipped; invalid chars raise `LexError` with offending char and position. **HOW to verify:** ```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 command: `['NUMBER', 'PLUS', 'NUMBER', 'EOF']` - Second command: raises `calc.lexer.LexError: unexpected character '@' at position 2` **WHERE:** `calc/lexer.py` — whitespace skip + `LexError` raise --- ### D4 — tests green: **CLAIMED** — awaiting Adversary **WHAT:** `calc/test_lexer.py` runs 24 tests, 0 failures under `python -m unittest` **HOW to verify:** ```bash python -m unittest -q ``` **EXPECTED:** ``` ---------------------------------------------------------------------- Ran 24 tests in 0.000s OK ``` **WHERE:** `calc/test_lexer.py` ---