# PBS AST Specification Status: Draft v1 Applies to: canonical AST contract emitted by PBS parser/frontend before IRBackend lowering ## 1. Purpose This document defines the mandatory AST contract between PBS parsing and frontend lowering to `IRBackend`. The contract is obligations-first: implementations may choose any internal representation, but must expose equivalent observable AST behavior and invariants. ## 2. Scope This document defines: - AST root and ordering invariants, - mandatory node families for declarations, statements, and expressions in the supported v1 slice, - mandatory node attribution and declaration metadata, - deterministic rejection and recovery boundaries, - and Gate U evidence obligations for AST conformance. This document does not define: - static-semantics algorithms, - runtime/bytecode/verifier behavior, - or `IRBackend -> IRVM` lowering. ## 3. Authority and Precedence Normative precedence: 1. `3. Core Syntax Specification.md` 2. `4. Static Semantics Specification.md` 3. `12. Diagnostics Specification.md` 4. This document 5. `13. Lowering IRBackend Specification.md` If a rule here conflicts with a higher-precedence source, the higher-precedence rule wins. ## 4. Normative Inputs This document depends on: - `3. Core Syntax Specification.md` - `4. Static Semantics Specification.md` - `12. Diagnostics Specification.md` - `13. Lowering IRBackend Specification.md` ## 5. AST Contract Model The AST contract is defined by required observable behavior, not by one mandatory class hierarchy or parser architecture. Conformance is implementation-language agnostic. ## 6. Root and Structural Invariants Parser output must satisfy all of the following: 1. exactly one AST root per source file; 2. deterministic child ordering consistent with source order; 3. preserved declaration and lexical block hierarchy; 4. parent/child span integrity (no structurally impossible attribution relationships); 5. no post-parse AST rewrite that changes source-observable parse meaning. ## 7. Mandatory Attribution and Declaration Metadata Every node consumed by diagnostics or lowering must carry stable source attribution: - `file`, - `start`, - `end`. Mandatory declaration metadata on required declaration nodes includes: 1. declaration name, 2. declared signature/surface when applicable (parameters/return), 3. declaration-level syntactic flags/attributes required by later phases, 4. stable `file/start/end` attribution, 5. lifecycle-marker metadata when a declaration carries `[Init]` or `[Frame]`. Missing required attribution or metadata on mandatory nodes is non-conformant. ## 8. Mandatory Declaration Families The v1 AST must represent, at minimum, declaration families for: - imports, - top-level `fn`, - `struct`, - `contract`, - `service`, - `error`, - `enum`, - `callback`, - `declare global`, - `declare const`, - and declaration nodes required by barrel/linking flow. Declaration identity must be preserved at AST boundary; implementations must not prematurely merge/collapse declarations (including overload sets). Lifecycle-observable declarations must preserve marker metadata explicitly: - top-level `fn` marked with `[Init]`, - top-level `fn` marked with `[Frame]`, - and host method signatures marked with `[InitAllowed]`. ## 9. Mandatory Statement and Expression Families The v1 AST must represent statement/expression families for the supported core syntax slice, including at minimum: - statements: `block`, `let`, `return`, expression statement; - expressions: `identifier`, literals, `unary`, `binary`, `call`, `group`. Additional supported forms required by `3` are also in scope for explicit node representation. ## 10. Precedence, Associativity, and Rejection Precedence and associativity outcomes are normative through AST shape. Rules: 1. accepted forms must preserve parse outcome explicitly in AST shape; 2. non-associative or forbidden chained forms are deterministic reject with stable diagnostics; 3. unsupported forms outside the active source slice are deterministic reject; 4. unsupported/invalid forms must not be masked by permissive synthetic nodes that imply accepted semantics. ## 11. Recovery and Diagnostics Integration Parser recovery may continue after syntax errors for diagnostic collection, but recovered AST must remain: - structurally coherent, - attribution-consistent, - and non-permissive (must not fabricate valid semantics that hide required rejection). AST-facing diagnostics must follow `12` identity and attribution rules. For conformance, required diagnostic identity is keyed by stable machine fields, not rendered sentence text. ## 12. Conformance and Gate U Evidence AST conformance evidence is provided through Gate U fixtures as defined in `docs/specs/compiler/13. Conformance Test Specification.md`. At minimum, Gate U must include: 1. representative valid AST fixtures for mandatory declaration/statement/expression families; 2. malformed/recovery fixtures with deterministic rejection assertions; 3. attribution assertions (`file/start/end`) on required nodes; 4. precedence/associativity shape assertions for representative expressions; 5. mandatory negative families: - unexpected token in declaration context, - missing required closer (`)`, `}`, or `;`) as applicable, - forbidden non-associative chains, - unsupported forms outside the active syntax slice. ## 13. Non-Goals - Freezing one parser implementation architecture. - Replacing static semantics/linking decisions with AST-only rules. - Defining backend/runtime/bytecode/verifier behavior. ## 14. Exit Criteria This document is healthy when: 1. mandatory AST families and metadata are explicit, 2. recovery/rejection invariants are explicit and test-backed, 3. attribution invariants are explicit and test-backed, 4. lowering preconditions consumed by `13` are unambiguous.