Date: 2026-09-16. Built in one day, with E. directing grammar choices against Kowarsch (arXiv:1809.07080) and the Blaise pipeline as process reference.
| Step | Tag | Content | Suite |
|---|---|---|---|
| 1 | m2comp-step1 | Coco/R lexer+parser, gm2 -fiso, LL(1)-clean |
3/3 |
| 1.1 | m2comp-step1.1 | Bare subrange type, syntax showcase | 4/4 |
| 2 | m2comp-step2 | SymTab semantic analysis (200–224, 230/232/233) | 19/19 |
| 3 | m2comp-step3 | AST layer (Mössenböck recipe) + dump | 25/25 |
| 4 | m2comp-step4 | MC64 tree-walking backend, .MC4 under mcint |
41/41 |
Layout: all sources in m2comp/src/ (grammar, frames, FileIO,
SymTab, AST, MGen, generated scanner/parser/driver), binary at
m2comp/M2comp, tests in m2comp/tests/ (check + reject + AST
dump + execution with ExitCode values), docs in m2comp/docs/
(per-step summaries, Kowarsch text, AST.pdf, oberon-master/
reference, this note).
FORWARD is rejected ("too many errors in
pass 3"); CR's -m flag comments forwards out; m2c has none.51H/70H store orders differ; use 70H ([addr, value]).Jmp/DefLabel).| head masks VM hangs (rc is head's); harness uses timeout
showcase.mod diverges by construction (infinite regress);
check-only. ok_proc fixed to terminate.D5 quirk reproduces byte-identically under
m2c — VM domain, avoided in tests.DEFINITION/IMPLEMENTATION separate compilation
(multi-.MC4, depCount loader path) — biggest language gap.WITH / CASE (grammar + SymTab already shaped for them).LONGINT/LONGREAL quads (0C5–CC, 0x12).SymTab (ByNum, exports, bounds), AST (pnum/typ/aux/tag),
MGen (scope stack, image assembly) are ready for all of these.
Start with ./build.sh && ./run_tests.sh (41/41, ~2 min).