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,6 +1,6 @@
// cfg_navigator.hako — CfgNavigatorBoxブロックの先頭/末尾シーク)
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox
static box CfgNavigatorBox {

View File

@ -1,7 +1,7 @@
// mir_vm_m2.nyash — Ny製の最小MIR(JSON v0)実行器M2: const/binop/ret
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 MirVmM2 {
_str_to_int(s) { return StringHelpers.to_i64(s) }

View File

@ -1,7 +1,7 @@
// mir_vm_min.hako — Ny製の最小MIR(JSON v0)実行器const/compare/copy/branch/jump/ret の最小)
using "lang/src/vm/boxes/op_handlers.hako" as OpHandlersBox
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/shared/json/utils/json_frag.hako" as JsonFragBox
using "lang/src/shared/json/json_cursor.hako" as JsonCursorBox
using "lang/src/vm/boxes/operator_box.hako" as OperatorBox

View File

@ -2,7 +2,7 @@
// Usage: import and call report(text) or analyze_dump_file(path)
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/shared/common/mini_vm_scan.hako" as MiniVmScan
static box SeamInspector {

View File

@ -1,5 +1,5 @@
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/shared/common/mini_vm_scan.hako" as MiniVmScan
static box Main {
// --- minimal helpers ---

View File

@ -2,7 +2,7 @@
using "lang/src/compiler/pipeline_v2/flow_entry.hako" as FlowEntryBox
using hakorune.vm.mir_min as MirVmMin
using "lang/src/shared/common/string_ops.hako" as StringOps
using selfhost.shared.common.string_ops as StringOps
static box FlowRunner {
_read_digits(text, pos) { local out = "" local i = pos loop(true) { local ch = text.substring(i, i+1) if ch == "" { break } if ch >= "0" && ch <= "9" { out = out + ch i = i + 1 } else { break } } return out }

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