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
|
|
|
[package]
|
|
|
|
|
name = "nescript"
|
|
|
|
|
version = "0.1.0"
|
|
|
|
|
edition = "2021"
|
|
|
|
|
description = "A statically-typed compiler for NES game development"
|
|
|
|
|
license = "MIT"
|
|
|
|
|
|
|
|
|
|
[dependencies]
|
|
|
|
|
clap = { version = "4", features = ["derive"] }
|
|
|
|
|
ariadne = "0.4"
|
2026-04-12 00:09:47 +00:00
|
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
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
|
|
|
|
|
|
|
|
[dev-dependencies]
|
|
|
|
|
pretty_assertions = "1"
|
|
|
|
|
|
|
|
|
|
[profile.release]
|
|
|
|
|
lto = true
|
|
|
|
|
strip = true
|
|
|
|
|
|
|
|
|
|
[lints.rust]
|
|
|
|
|
unsafe_code = "forbid"
|
|
|
|
|
|
|
|
|
|
[lints.clippy]
|
|
|
|
|
all = { level = "warn", priority = -1 }
|
|
|
|
|
pedantic = { level = "warn", priority = -1 }
|
|
|
|
|
# Allow patterns common in compiler code
|
|
|
|
|
module_name_repetitions = "allow"
|
|
|
|
|
must_use_candidate = "allow"
|
|
|
|
|
missing_errors_doc = "allow"
|
|
|
|
|
missing_panics_doc = "allow"
|
|
|
|
|
cast_possible_truncation = "allow"
|
|
|
|
|
wildcard_imports = "allow"
|
|
|
|
|
option_if_let_else = "allow"
|
|
|
|
|
match_same_arms = "allow"
|
|
|
|
|
unnested_or_patterns = "allow"
|
|
|
|
|
missing_const_for_fn = "allow"
|
|
|
|
|
too_many_lines = "allow"
|
|
|
|
|
single_match_else = "allow"
|
|
|
|
|
unnecessary_wraps = "allow"
|
|
|
|
|
unused_self = "allow"
|
|
|
|
|
enum_glob_use = "allow"
|
|
|
|
|
manual_assert = "allow"
|
|
|
|
|
vec_init_then_push = "allow"
|
|
|
|
|
struct_field_names = "allow"
|