Implement NEScript compiler Milestone 1 ("Hello Sprite")
Complete implementation of the NEScript compiler pipeline for M1:
- Lexer: full tokenization with hex/binary/decimal literals, all keywords, operators
- Parser: recursive descent with Pratt expression parsing (M1 subset)
- Analyzer: symbol resolution, type checking, memory allocation
- 6502 Assembler: full opcode encoding table (~150 valid combinations)
- Code Generator: AST → 6502 instructions (direct, no IR for M1)
- Runtime: NES hardware init, NMI handler, controller read, OAM DMA
- Linker: NROM layout, vector table, palette loading, CHR data
- ROM Builder: iNES header generation, PRG/CHR padding
- CLI: `build` and `check` subcommands via clap
143 tests across all modules:
- 22 lexer tests (literals, keywords, operators, error recovery)
- 18 parser tests (expressions, statements, game structure, errors)
- 7 analyzer tests (symbol resolution, memory allocation, transitions)
- 30 assembler tests (every addressing mode, label resolution)
- 7 codegen tests (var init, arithmetic, buttons, draw, comparisons)
- 11 runtime tests (init sequence, NMI handler, controller read)
- 10 ROM builder tests (iNES format, mirroring, banking, validation)
- 5 linker tests (vector table, CHR data, palette loading)
- 7 integration tests (end-to-end compilation, error detection)
CI: GitHub Actions for check, fmt, clippy, test
Pre-commit: script for local fmt + clippy + test validation
https://claude.ai/code/session_01W6eQFStA66EuMKHUFo2rx3
2026-04-11 22:07:56 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
# Pre-commit hook for nescript
|
|
|
|
|
# Install: cp scripts/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
echo "Running pre-commit checks..."
|
|
|
|
|
|
|
|
|
|
echo " Checking formatting..."
|
|
|
|
|
cargo fmt --all -- --check
|
|
|
|
|
|
|
|
|
|
echo " Running clippy..."
|
|
|
|
|
cargo clippy --all-targets -- -D warnings
|
|
|
|
|
|
|
|
|
|
echo " Running tests..."
|
|
|
|
|
cargo test --all-targets
|
|
|
|
|
|
2026-04-13 15:12:18 +00:00
|
|
|
# Committed ROMs must match their .ne sources — the compiler is
|
|
|
|
|
# deterministic, so any example whose on-disk .nes differs from a
|
|
|
|
|
# fresh build means someone edited the .ne file but forgot to
|
|
|
|
|
# rebuild. Rebuild each to a tmp path and fail if any differ, then
|
|
|
|
|
# point the user at the exact `cargo run` command to fix it.
|
|
|
|
|
echo " Checking committed ROMs match .ne sources..."
|
|
|
|
|
cargo build --release --quiet
|
|
|
|
|
tmp=$(mktemp -d)
|
|
|
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
|
|
|
stale=0
|
|
|
|
|
for f in examples/*.ne; do
|
|
|
|
|
name=$(basename "$f" .ne)
|
|
|
|
|
./target/release/nescript build "$f" --output "$tmp/$name.nes" >/dev/null
|
|
|
|
|
if ! cmp -s "examples/$name.nes" "$tmp/$name.nes"; then
|
|
|
|
|
echo " STALE: examples/$name.nes"
|
|
|
|
|
echo " rerun: cargo run --release -- build $f"
|
|
|
|
|
stale=1
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
if [ $stale -ne 0 ]; then
|
|
|
|
|
echo "one or more committed ROMs are out of date"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
Implement NEScript compiler Milestone 1 ("Hello Sprite")
Complete implementation of the NEScript compiler pipeline for M1:
- Lexer: full tokenization with hex/binary/decimal literals, all keywords, operators
- Parser: recursive descent with Pratt expression parsing (M1 subset)
- Analyzer: symbol resolution, type checking, memory allocation
- 6502 Assembler: full opcode encoding table (~150 valid combinations)
- Code Generator: AST → 6502 instructions (direct, no IR for M1)
- Runtime: NES hardware init, NMI handler, controller read, OAM DMA
- Linker: NROM layout, vector table, palette loading, CHR data
- ROM Builder: iNES header generation, PRG/CHR padding
- CLI: `build` and `check` subcommands via clap
143 tests across all modules:
- 22 lexer tests (literals, keywords, operators, error recovery)
- 18 parser tests (expressions, statements, game structure, errors)
- 7 analyzer tests (symbol resolution, memory allocation, transitions)
- 30 assembler tests (every addressing mode, label resolution)
- 7 codegen tests (var init, arithmetic, buttons, draw, comparisons)
- 11 runtime tests (init sequence, NMI handler, controller read)
- 10 ROM builder tests (iNES format, mirroring, banking, validation)
- 5 linker tests (vector table, CHR data, palette loading)
- 7 integration tests (end-to-end compilation, error detection)
CI: GitHub Actions for check, fmt, clippy, test
Pre-commit: script for local fmt + clippy + test validation
https://claude.ai/code/session_01W6eQFStA66EuMKHUFo2rx3
2026-04-11 22:07:56 +00:00
|
|
|
echo "All pre-commit checks passed."
|