# JOURNAL — phase parse ## Implementation run ### Grammar chosen ``` expr → term (('+' | '-') term)* term → unary (('*' | '/') unary)* unary → '-' unary | primary primary → NUMBER | '(' expr ')' ``` `while` loops in `expr`/`term` give left-associativity automatically. `unary` recurses right for `--x` chains. ### Local verification output ``` $ python -m unittest -q ---------------------------------------------------------------------- Ran 39 tests in 0.001s OK $ python -c "...all gate assertions..." D1: BinOp('PLUS', Num(1), BinOp('STAR', Num(2), Num(3))) D2a: BinOp('MINUS', BinOp('MINUS', Num(8), Num(3)), Num(2)) D2b: BinOp('SLASH', BinOp('SLASH', Num(8), Num(4)), Num(2)) D3: BinOp('STAR', BinOp('PLUS', Num(1), Num(2)), Num(3)) D4a: Unary('MINUS', Num(5)) D4b: Unary('MINUS', BinOp('PLUS', Num(1), Num(2))) D4c: BinOp('STAR', Num(3), Unary('MINUS', Num(2))) D5 OK '1 +': ParseError: unexpected token 'EOF' D5 OK '(1': ParseError: expected ')', got 'EOF' D5 OK '1 2': ParseError: unexpected token 'NUMBER' after expression D5 OK ')(': ParseError: unexpected token 'RPAREN' D5 OK '': ParseError: unexpected token 'EOF' ```