Files
hakorune/lang/src/compiler/pipeline_v2/flow_entry.hako
nyash-codex df9068a555 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>
2025-11-02 04:13:17 +09:00

55 lines
2.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// flow_entry.hako — Pipeline v2 entry boxemit-only
// Guard: This box performs no execution. Returns MIR(JSON) as text.
using lang.compiler.pipeline_v2.pipeline as PipelineV2
using selfhost.shared.json.mir_v1_adapter as MirJsonV1Adapter
static box FlowEntryBox {
// Emit legacy v0 JSONcall/boxcall/newbox。最小入力: Stage1 JSON 文字列
emit_v0_from_ast(ast_json, prefer_cfg) {
return PipelineV2.lower_stage1_to_mir(ast_json, prefer_cfg)
}
// Emit v0 with using contextalias/module maps
emit_v0_from_ast_with_usings(ast_json, prefer_cfg, usings_json, modules_json) {
return PipelineV2.lower_stage1_to_mir_with_usings(ast_json, prefer_cfg, usings_json, modules_json)
}
// Emit v0 with optional using / extern metadataStageB entry
emit_v0_from_ast_with_context(ast_json, prefer_cfg, usings_json, modules_json, externs_json) {
local used_with_usings = 0
local out = null
if usings_json != null && usings_json != "" && usings_json != "[]" {
out = PipelineV2.lower_stage1_to_mir_with_usings(ast_json, prefer_cfg, usings_json, modules_json)
if out != null { used_with_usings = 1 }
}
if out == null {
out = PipelineV2.lower_stage1_to_mir(ast_json, prefer_cfg)
}
if externs_json != null && externs_json != "" && externs_json != "[]" && used_with_usings == 0 {
local j1 = PipelineV2.lower_stage1_to_mir_v1_with_meta(ast_json, prefer_cfg, externs_json)
if j1 != null { out = MirJsonV1Adapter.to_v0(j1) }
}
return out
}
// Emit v1 → v0 互換 JSONunified mir_call を一旦生成して適応)。自己ホスト実行向け
emit_v1_compat_from_ast(ast_json, prefer_cfg) {
return PipelineV2.lower_stage1_to_mir_v1_compat(ast_json, prefer_cfg)
}
// Emit v1 JSON with metadata.extern_cexterns を v1 の metadata に反映)
// externs_json: JSON array text, e.g. [{"func":"Name/Arity","symbol":"c_symbol"}]
emit_v1_from_ast_with_meta(ast_json, prefer_cfg, externs_json) {
return PipelineV2.lower_stage1_to_mir_v1_with_meta(ast_json, prefer_cfg, externs_json)
}
// Emit v1 JSON + metadata.extern_c を注入し、v0互換に変換
emit_v1_compat_from_ast_with_meta(ast_json, prefer_cfg, externs_json) {
local j1 = PipelineV2.lower_stage1_to_mir_v1_with_meta(ast_json, prefer_cfg, externs_json)
return MirJsonV1Adapter.to_v0(j1)
}
// No-op entry箱ガード用
main(args) { return 0 }
}