|
@@ -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
|
|
|
|
|
+```
|