summary_step1.4.md 2.2 KB

V3 step 1.4 — module structure: three units + imports + opaque + nesting (done 2026-09-19)

Interactive grammar §2, landed as syntax-now/backend-later: everything parses and type-checks, but only program modules lower to QBE. Suite 9/9 (3 run + 6 reject), LL(1)-clean first try.

Grammar (compiler/src/M2.atg)

  • M2 = Unit ".", Unit = DefUnit | ImplUnit | ProgModule (FIRSTs DEFINITION/IMPLEMENTATION/MODULE — no conflicts).
  • DefUnit: DEFINITION MODULE + imports + CONST/TYPE(opaque)/ VAR, ends with one 230 (lowering = step 4). Procedure headings arrive with the declarations section (§next).
  • ImplUnit: full DeclSeq + optional BEGIN, ends with one 230.
  • ProgModule: as before + optional Priority ("[" integer "]" → 230) + { Import }; only this path calls QbeGen.EndModule.
  • DeclSeq = { ConstBlock | VarBlock | NestedModule ";" }.
  • NestedModule: Wirth form — own scope via PushScope/PopScope, imports, EXPORT [QUALIFIED] list ; (parse-only, wires in step 4), optional Priority, decls, optional body without BeginBody (no fake main in the outer file), one 230 at END.
  • Import: both FROM A IMPORT x, y; and IMPORT A, B; (V2 parity); names entered as KindImport, use-as-value already 230 via Design.
  • OpaqueBlock: TYPE T; enters a targetless NewAlias() which resolves to InvalidType until step 4 completes it — cascades suppressed by the standard Invalid rules.

Support changes

  • QbeGen.CloseModule (def+mod): closes the .ssa with an honest # no code remark instead of a bogus main.
  • 230 text reworded "not supported in step 1 (integers only)" → "not supported yet" (no tests referenced the old text).

Tests

t_defunit (CONST+opaque+VAR definition → single 230, no cascades), t_implunit (→ single 230), t_nested (inner y := 2 checks clean in its scope, y after END Inner → 201 proves the pop, + 230).

Decisions locked (§2)

Three units now; both IMPORT forms; classic opaque TYPE T;; nesting kept (Wirth form + EXPORT); priority accepted-but-230. Next: § declarations (TYPE syntax, CONST expressions, procedure headings — including ProcHeading ";" for DefUnit).