artifacts: add calculators/ — the 30 built calculators (5/variant) + machine-docs + git logs
This commit is contained in:
@ -0,0 +1,91 @@
|
||||
# STATUS — phase parse
|
||||
|
||||
## DONE
|
||||
|
||||
## Claimed gates: D1, D2, D3, D4, D5, D6
|
||||
|
||||
Commit: fa50146a5acbc9e7cf65a1e60e0b0fba2d8bd2ea (main)
|
||||
Files: `calc/parser.py`, `calc/test_parser.py`
|
||||
|
||||
---
|
||||
|
||||
## What is claimed
|
||||
|
||||
- **D1 — precedence**: `*`/`/` bind tighter than `+`/`-`
|
||||
- **D2 — left associativity**: same-precedence ops are left-associative
|
||||
- **D3 — parentheses**: parens override default precedence
|
||||
- **D4 — unary minus**: leading and nested unary minus handled
|
||||
- **D5 — errors**: malformed inputs raise `ParseError` (not any other exception)
|
||||
- **D6 — tests green**: `python -m unittest -q` → 36 tests, 0 failures
|
||||
|
||||
---
|
||||
|
||||
## How to verify (exact commands)
|
||||
|
||||
```bash
|
||||
# D6 — all tests green
|
||||
python -m unittest -q
|
||||
|
||||
# D1 — mul binds tighter than add
|
||||
python -c "from calc.lexer import tokenize; from calc.parser import parse; t=parse(tokenize('1+2*3')); print(t); assert str(t)==\"BinOp('+', Num(1), BinOp('*', Num(2), Num(3)))\""
|
||||
|
||||
# D2 — left associativity subtraction
|
||||
python -c "from calc.lexer import tokenize; from calc.parser import parse; t=parse(tokenize('8-3-2')); print(t); assert str(t)==\"BinOp('-', BinOp('-', Num(8), Num(3)), Num(2))\""
|
||||
|
||||
# D2 — left associativity division
|
||||
python -c "from calc.lexer import tokenize; from calc.parser import parse; t=parse(tokenize('8/4/2')); print(t); assert str(t)==\"BinOp('/', BinOp('/', Num(8), Num(4)), Num(2))\""
|
||||
|
||||
# D3 — parens override precedence
|
||||
python -c "from calc.lexer import tokenize; from calc.parser import parse; t=parse(tokenize('(1+2)*3')); print(t); assert str(t)==\"BinOp('*', BinOp('+', Num(1), Num(2)), Num(3))\""
|
||||
|
||||
# D4 — unary minus
|
||||
python -c "from calc.lexer import tokenize; from calc.parser import parse; print(parse(tokenize('-5'))); print(parse(tokenize('-(1+2)'))); print(parse(tokenize('3 * -2')))"
|
||||
|
||||
# D5 — all five error inputs raise ParseError
|
||||
python -c "
|
||||
from calc.lexer import tokenize
|
||||
from calc.parser import parse, ParseError
|
||||
for src in ['1 +', '(1', '1 2', ')(', '']:
|
||||
try:
|
||||
parse(tokenize(src))
|
||||
print('FAIL — no error for', repr(src))
|
||||
except ParseError:
|
||||
print('OK', repr(src))
|
||||
"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Expected output
|
||||
|
||||
**D6**: `Ran 36 tests ... OK`
|
||||
|
||||
**D1**: `BinOp('+', Num(1), BinOp('*', Num(2), Num(3)))` (no assertion error)
|
||||
|
||||
**D2-sub**: `BinOp('-', BinOp('-', Num(8), Num(3)), Num(2))` (no assertion error)
|
||||
|
||||
**D2-div**: `BinOp('/', BinOp('/', Num(8), Num(4)), Num(2))` (no assertion error)
|
||||
|
||||
**D3**: `BinOp('*', BinOp('+', Num(1), Num(2)), Num(3))` (no assertion error)
|
||||
|
||||
**D4**:
|
||||
```
|
||||
Unary('-', Num(5))
|
||||
Unary('-', BinOp('+', Num(1), Num(2)))
|
||||
BinOp('*', Num(3), Unary('-', Num(2)))
|
||||
```
|
||||
|
||||
**D5**: Five lines all starting with `OK`
|
||||
|
||||
---
|
||||
|
||||
## AST shape reference
|
||||
|
||||
```
|
||||
Num(value) # numeric literal; value: int | float
|
||||
BinOp(op, left, right) # binary op; op in {'+', '-', '*', '/'}
|
||||
Unary(op, operand) # unary op; op == '-'
|
||||
```
|
||||
|
||||
Precedence (high → low): unary-minus > `*` `/` > `+` `-`
|
||||
Associativity: left for all binary operators
|
||||
Reference in New Issue
Block a user