# Compiler Roadmap

A Rust-flavored, C-targeting language - built pipeline-first.

**Implementation language:** Rust  
**Code generation target:** Native object files (`.o`) via Cranelift JIT/AOT

## Phase 1 - Lexer

- [x] Define token enum (int literal, bool literal, ident, keywords, operators, punctuation)
- [x] Implement character-by-character scanner loop
- [x] Handle whitespace & single-line comments (`//`)
- [x] Produce source spans (file, line, col) on every token
- [x] Unit-test: known inputs → expected token streams

## Phase 2 - Parser

- [x] Write grammar for the base subset
  - `fn` declarations, `return`, int/bool literals
  - Arithmetic (`+`, `-`, `*`, `/`)
- [x] Implement recursive-descent parser
- [x] Attach source spans to every AST node
- [x] Emit structured parse errors with span info
- [x] Unit-test: parse valid snippets, expect correct AST shapes

## Phase 3 - Semantic Analysis

- [x] Implement scope-aware symbol table (environment)
- [x] Name resolution pass - resolve all `Ident` nodes to their declarations
- [x] Hindley-Milner type inference (unification, type variables, occurs check)
- [x] Integer literal sizing and unary minus type promotion logic
- [x] Translate untyped AST directly into a fully-typed AST (Typed AST)
- [x] Validate function return types match declared signature
- [x] Error on use-before-declaration, undeclared symbols, and type mismatches
- [x] Unit-test: HM unification, type mappings, and ill-typed program diagnostics

## Phase 4 - Code Generation via Cranelift

- [x] Integrate `cranelift-codegen`, `cranelift-frontend`, and `cranelift-object`
- [x] Implement CLI with `clap` (`--emit-ir` flag, input/output files)
- [x] Map Typed AST types (`Ty`) to Cranelift IR types
- [x] Lower functions, parameters, and variable definitions to Cranelift IR
- [x] Codegen for arithmetic, unary operations, and `return` statements
- [x] Run built-in optimization passes (constant folding, e-graphs, DCE)
- [x] Output System V AMD64 ABI-compliant `.o` machine code files
- [x] End-to-end test: compile a simple `fn` → link via `gcc` → run → correct exit code

## Phase 5 - The Ray Tracer Milestone (Current)

To successfully write a simple ray tracer, we need continuous math, data structures, and I/O. The following path establishes these prerequisites:

- [x] **Floating-Point Support:** Add `f32`/`f64` types, decimal literals, and Cranelift lowering for `fadd`, `fmul`, etc.
- [x] **FFI & Interop:** Implement `extern fn` declarations to bind C standard library functions (like `putchar` or `printf`) for `.ppm` image output.
- [x] **Type Casting:** Add the `as` operator to convert floating-point color bounds `[0.0, 1.0]` into integer byte formats `[0, 255]`.
- [ ] **Pointers:** Add pointer types (`*T`), address-of (`&`), and dereference (`*`) operators.
- [ ] **Structs:** Add `struct` definitions, initializers, and field access (`ray.origin.x`) to represent 3D vectors, rays, and spheres.
- [ ] **Arrays:** Add fixed-size arrays (`[T; N]`) or heap allocations for the scene and framebuffers.

## Planned Features (Backlog)

### Control flow & Variables
- [x] booleans and comparision operators
- [x] `if` / `else` branching
- [x] `while` loops, `break`, `continue`
- [x] `let` bindings and variable assignments

### Types & memory
- [ ] Opaque pointers (`*void` / `*opaque`)
- [ ] Raw pointer arithmetic
- [ ] Slices (`&[T]` / `[]T`)

### Composite types
- [ ] Enums (C-style tagged unions)
- [ ] Pattern matching (`match` / `switch`)

### Strings & interop
- [ ] String literals
- [ ] Variadic functions (for `printf` interop)

### Tooling & backend
- [ ] Proper register allocator
- [ ] Debug info (DWARF)
- [ ] Standard library bootstrap (`print`, `malloc` wrapper)