feat(stage-b): Add FLOW keyword support + fix Stage-3 keyword conflicts

##  Fixed Issues

### 1. `local` keyword tokenization (commit 9aab64f7)
- Added Stage-3 gate for LOCAL/TRY/CATCH/THROW keywords
- LOCAL now only active when NYASH_PARSER_STAGE3=1

### 2. `env.local.get` keyword conflict
- File: `lang/src/compiler/entry/compiler_stageb.hako:21-23`
- Problem: `.local` in member access tokenized as `.LOCAL` keyword
- Fix: Commented out `env.local.get("HAKO_SOURCE")` line
- Fallback: Use `--source` argument (still functional)

### 3. `flow` keyword missing
- Added FLOW to TokenType enum (`src/tokenizer/kinds.rs`)
- Added "flow" → TokenType::FLOW mapping (`src/tokenizer/lex_ident.rs`)
- Added FLOW to Stage-3 gate (requires NYASH_PARSER_STAGE3=1)
- Added FLOW to parser statement dispatch (`src/parser/statements/mod.rs`)
- Added FLOW to declaration handler (`src/parser/statements/declarations.rs`)
- Updated box_declaration parser to accept BOX or FLOW (`src/parser/declarations/box_definition.rs`)
- Treat `flow FooBox {}` as syntactic sugar for `box FooBox {}`

### 4. Module namespace conversion
- Renamed `lang.compiler.builder.ssa.local` → `localvar` (avoid keyword)
- Renamed file `local.hako` → `local_ssa.hako`
- Converted 152 path-based using statements to namespace format
- Added 26+ entries to `nyash.toml` [modules] section

## ⚠️ Remaining Issues

### Stage-B selfhost compiler performance
- Stage-B compiler not producing output (hangs/times out after 10+ seconds)
- Excessive PHI debug output suggests compilation loop issue
- Needs investigation: infinite loop or N² algorithm in hako compiler

### Fallback JSON version mismatch
- Rust fallback (`--emit-mir-json`) emits MIR v1 JSON (schema_version: "1.0")
- Smoke tests expect MIR v0 JSON (`"version":0, "kind":"Program"`)
- stageb_helpers.sh fallback needs adjustment

## Test Status
- Parse errors: FIXED 
- Keyword conflicts: FIXED 
- Stage-B smoke tests: STILL FAILING  (performance issue)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-02 04:13:17 +09:00
parent 82cdfa7056
commit df9068a555
115 changed files with 478 additions and 232 deletions

View File

@ -1,7 +1,7 @@
// ArgsExtractorBox - Extract and load arguments from MirCall JSON
// Single Responsibility: Parse args array, load values from registers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox

View File

@ -2,7 +2,7 @@
// Handles: %dst = %lhs op_kind %rhs (Add/Sub/Mul/Div/Mod)
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox

View File

@ -3,7 +3,7 @@
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/function_locator.hako" as FunctionLocatorBox
using "lang/src/vm/hakorune-vm/blocks_locator.hako" as BlocksLocatorBox

View File

@ -1,7 +1,7 @@
// CalleeParserBox - Extract callee information from MirCall JSON
// Single Responsibility: Parse callee field and extract type/name
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor

View File

@ -3,7 +3,7 @@
// Note: Full closure calling via Callee::Value is Phase 4 Day 16
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox

View File

@ -2,7 +2,7 @@
// Handles: %dst = const value
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor

View File

@ -4,7 +4,7 @@
// Phase 1 Day 3: 制御フロー実装Branch/Jump/Phi- 箱化モジュール化
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/hakorune-vm/json_scan_guard.hako" as JsonScanGuardBox
using "lang/src/vm/boxes/result_box.hako" as Result
// Phase 1 Day 3: 箱化モジュール化

View File

@ -1,7 +1,7 @@
// InstructionDispatcherBox - Dispatch instructions to specific handlers
// Single Responsibility: Extract op field and route to correct handler
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox

View File

@ -2,7 +2,7 @@
// Centralizes JSON field parsing logic
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
static box JsonFieldExtractor {
// Extract integer field from JSON

View File

@ -4,7 +4,7 @@
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/gc/gc_runtime.hako" as GcRuntime
static box NewBoxHandlerBox {

View File

@ -3,7 +3,7 @@
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps

View File

@ -2,7 +2,7 @@
// Strategy: 箱化モジュール化 - Ret/Jump/Branch を分離
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/instrs_locator.hako" as InstrsLocatorBox
using "lang/src/vm/hakorune-vm/backward_object_scanner.hako" as BackwardObjectScannerBox

View File

@ -2,7 +2,7 @@
// Handles: %dst = op_kind %operand (Neg/Not/BitNot)
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/vm/boxes/result_box.hako" as Result
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox