Root Cause: - Else blocks were not propagating variable assignments to outer scope - Bug 1 (if_form.rs): PHI materialization happened before variable_map reset, causing PHI nodes to be lost - Bug 2 (phi.rs): Variable merge didn't check if else branch modified variables Changes: - src/mir/builder/if_form.rs:93-127 - Reordered: reset variable_map BEFORE materializing PHI nodes - Now matches then-branch pattern (reset → materialize → execute) - Applied to both "else" and "no else" branches for consistency - src/mir/builder/phi.rs:137-154 - Added else_modified_var check to detect variable modifications - Use modified value from else_var_map_end_opt when available - Fall back to pre-if value only when truly not modified Test Results: ✅ Simple block: { x=42 } → 42 ✅ If block: if 1 { x=42 } → 42 ✅ Else block: if 0 { x=99 } else { x=42 } → 42 (FIXED!) ✅ Stage-B body extraction: "return 42" correctly extracted (was null) Impact: - Else block variable assignments now work correctly - Stage-B compiler body extraction restored - Selfhost builder path can now function - Foundation for Phase 21.x progress 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
37 lines
2.1 KiB
Markdown
37 lines
2.1 KiB
Markdown
# Nyash Language Reference – Index
|
||
|
||
This is the entry point for Nyash language documentation.
|
||
|
||
- Full Language Reference (2025): reference/language/LANGUAGE_REFERENCE_2025.md
|
||
- Syntax Cheat Sheet: quick-reference/syntax-cheatsheet.md
|
||
- Phase 12.7 Grammar Specs (ternary, sugar; peek → match に統合):
|
||
- Overview: development/roadmap/phases/phase-12.7/grammar-specs/README.md
|
||
- Token/Grammar: development/roadmap/phases/phase-12.7/ancp-specs/ANCP-Token-Specification-v1.md
|
||
- Sugar Transformations (?., ??, |> and friends): parser/sugar.rs (source) and tools/nyfmt/NYFMT_POC_ROADMAP.md
|
||
- Match Expression (pattern matching): see the Language Reference and EBNF (peek was replaced by match)
|
||
|
||
Statement separation and semicolons
|
||
- See: reference/language/statements.md — newline as primary separator; semicolons optional for multiple statements on one line; minimal ASI rules.
|
||
|
||
Imports and namespaces
|
||
- See: reference/language/using.md — `using` syntax, runner resolution, and style guidance.
|
||
|
||
Variables and scope
|
||
- See: reference/language/variables-and-scope.md — Block-scoped locals, assignment resolution, and strong/weak reference guidance.
|
||
|
||
Grammar (EBNF)
|
||
- See: reference/language/EBNF.md — Stage‑2 grammar specification used by parser implementations.
|
||
- Unified Members (stored/computed/once/birth_once): see reference/language/EBNF.md “Box Members (Phase 15)” and the Language Reference section. Default ON (disable with `NYASH_ENABLE_UNIFIED_MEMBERS=0`).
|
||
|
||
Member exceptions and handlers (Stage‑3)
|
||
- Postfix `catch/cleanup` may be attached to computed/once/birth_once/method blocks when Stage‑3 is enabled. Stored members (plain `name: Type [= expr]`) do not support handlers.
|
||
|
||
Related implementation notes
|
||
- Tokenizer: src/tokenizer.rs
|
||
- Parser (expressions/statements): src/parser/expressions.rs, src/parser/statements.rs
|
||
- MIR Lowering (expressions): src/mir/builder/exprs.rs and friends
|
||
|
||
Navigation tips
|
||
- The “reference/language/LANGUAGE_REFERENCE_2025.md” is the canonical long‑form reference; use the Cheat Sheet for quick syntax lookup.
|
||
- Phase 12.7 files capture the finalized sugar and new constructs (match (replaces peek), ternary, null‑safe).
|