소스 검색

docs: session summary 2026-10-04 (AST frontend complete, ready for Lower)

Slices 9-13: brace/set literals, ResultComp + unbounded sequences,
imports, nested modules, CLASS.  The inert AST now covers every
declaration, statement and expression; emit is unchanged.  Suite
178/178, fixpoint OK (3042040 bytes).  Records conventions, the four
bugs fixed, and the Lower plan.
Eric Streit 1 주 전
부모
커밋
9d5eea9bff
1개의 변경된 파일과 72개의 추가작업 그리고 0개의 파일을 삭제
  1. 72 0
      docs/summary_two-phase-session-2026-10-04.md

+ 72 - 0
docs/summary_two-phase-session-2026-10-04.md

@@ -0,0 +1,72 @@
+# Session summary — 2026-10-04 (AST frontend complete; ready for `Lower`)
+
+Branch **`ast-stage-c`**.  Suite **178/178**; self-hosting fixpoint
+**OK** (**3,042,040 bytes**).
+
+The two-phase frontend's **inert AST is now feature-complete**: the
+parser builds a tree for every declaration (incl. `CLASS`, imports,
+nested modules), every statement, and every expression, **alongside**
+the legacy emit path (which is unchanged, so the fixpoint stays
+byte-identical).  The tree is not consumed yet — `Lower` is the next
+phase.
+
+## This session's slices
+
+| Tag | Doc | What |
+| --- | --- | --- |
+| `v3-ast-slice9` | `summary_two-phase-slice9.md` | brace/set literals (`NkBraceLit`/`NkSetLit`) |
+| `v3-ast-slice10` | `summary_two-phase-slice10.md` | `ResultComp` suffixes; **unbounded `NkBlock`/`NkDeclSeq`** (`AstAppend`) |
+| `v3-ast-slice11` | `summary_two-phase-slice11.md` | imports (`NkImport`) |
+| `v3-ast-slice12` | `summary_two-phase-slice12.md` | nested modules (`NkUnit`) |
+| `v3-ast-slice13` | `summary_two-phase-slice13.md` | `CLASS`/`CLASS IMPLEMENTATION`; `TypeBlock` collection fix |
+
+(Slices 1–8 — expressions, designators, calls, statements, declarations,
+unit root, builtins, `CASE`/`WITH` — landed 2026-10-03; see
+`summary_two-phase-session-2026-10-03.md`.)
+
+## Bugs found & fixed while verifying
+
+- **8-child cap**: `NkBlock`/`NkDeclSeq` silently dropped statements past
+  the 7th — now chunked/unbounded.
+- **`NkImport` leaf mis-classification** made walks mis-read its child 0.
+- **`TypeBlock` never collected its items** — only the last `TYPE`/`CLASS`
+  declaration survived to `DeclSeq` (latent since slice 6).
+- **`SetChild` cannot skip an unset child** — class-implementation
+  methods/body were dropped; a body-less class impl also leaked the last
+  method's body.
+
+Each slice was gated by `build.sh` + `run_tests.sh` + `fixpoint.sh`, with
+the tree shape checked by a **temporary `AST.Dump`** in the root
+production (removed before commit).
+
+## AST conventions (for the `Lower` phase)
+
+- Result slots: `astCur` (expr), `astStmt` (stmt), `astDecl` (decl),
+  `astUnit` (root); lists built with `AstAppend` (unbounded chunks).
+- `NkDesignator(base, selector…)` — `NkSelector` op `SelField`/`SelIndex`/
+  `SelDeref`; `NkCall(callee, actual…)`.
+- Declaration nodes reference resolved types by the node's **`ty`**
+  (`SymTab.TypeIndex`) rather than structural type trees.
+- `NkUnit(name, decls, body, imports)`; `NkClassDecl(name, parents,
+  fields, methods)`, methods `NkProcDecl` (`op`: normal/virtual/forward).
+- **Do not use local arrays** in grammar actions until the local-array
+  miscompile is fixed (`docs/wip/local-array-bug.mod`).
+
+## Remaining before/within `Lower`
+
+1. **`Lower` walk + `.ssa` byte-compare** (plan §3 phase 2): re-emit from
+   the AST, compare to the legacy `.ssa`, then flip and delete the inline
+   emit + forward-patching (`FwdPatchAll`/`FixLoadClass`/`FixStoreClass`,
+   the `Design` forward path, the grammar's `FwdVar*`).
+2. `MaxChild` cap still applies to `CASE` arms / `WITH` designators / call
+   actuals — give them the chunked treatment.
+3. Standalone fix for the **local-array miscompile**.
+
+## Resume
+
+```sh
+cd ~/Projets/Projets-Modula2/MyWork/m2compiler-V3
+git checkout ast-stage-c
+cd compiler && ./build.sh && ./run_tests.sh   # 178/178
+cd .. && ./bootstrap/fixpoint.sh              # FIXPOINT OK
+```