diff --git a/CLAUDE.md b/CLAUDE.md index 84b87805..145a3bc4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -221,11 +221,12 @@ NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.nyash ``` -## 📝 Update (2025-09-13) 🎉 LLVM大進展! -- ✅ dep_tree_min_string.nyashのオブジェクト生成成功!(10.4KB) -- ✅ LLVM verifier green - dominance違反解決! -- 🐍 Python/llvmlite版を正式採用予定(開発速度10倍) -- 🎯 Phase 15セルフホスティング継続中(80k→20k行目標) +## 📝 Update (2025-09-14) 🎉 セルフホスティング大前進! +- ✅ Python LLVM実装が実用レベル到達!(esc_dirname_smoke, min_str_cat_loop, dep_tree_min_string全てPASS) +- 🚀 パーサーのNyash実装開始!ChatGPT5が`apps/selfhost/parser/`で実装中 +- 📚 peek式の再発見 - when→peekに名前変更、ブロック/値/文すべて対応済み +- 🧠 箱理論でSSA構築を簡略化(650行→100行)- 論文執筆完了 +- 🤝 AI協働の知見を論文化 - 実装駆動型学習の重要性を実証 - 📋 詳細: [Phase 15 README](docs/development/roadmap/phases/phase-15/README.md) ### 🚀 新発見:プラグイン全方向ビルド戦略 @@ -362,6 +363,31 @@ a / b // 除算(ゼロ除算エラー対応済み) a + b, a - b, a * b // 加算・減算・乗算 ``` +### 🎯 peek式(パターンマッチング) +```nyash +// 値を返す式として使用 +local dv = peek d { + "0" => 0, + "1" => 1, + "2" => 2, + else => 0 +} + +// ブロックで複雑な処理も可能 +local result = peek status { + "success" => { log("OK"); 200 } + "error" => { log("NG"); 500 } + else => 404 +} + +// 文として使用(値を捨てる) +peek action { + "save" => save_data() + "load" => load_data() + else => print("Unknown") +} +``` + ### ⚠️ 重要な注意点 ```nyash // ✅ 正しい書き方(Phase 12.7文法改革後) @@ -467,10 +493,10 @@ gemini -p "Nyashの実装で困っています..." codex exec "質問内容" ``` -### 🐍 Python LLVM バックエンド (実験的実装) +### 🐍 Python LLVM バックエンド (実用レベル到達!) **場所**: `/src/llvm_py/` -ChatGPTの調査待ち中に作成した、llvmliteベースのLLVMバックエンド実装にゃ。 +llvmliteベースのLLVMバックエンド実装。箱理論により650行→100行の簡略化を実現! Rust/inkwellの複雑さを回避して、シンプルに2000行程度でMIR14→LLVM変換を実現。 #### 実行方法 @@ -586,5 +612,5 @@ find . -name "*.md" -exec wc -l {} \; Notes: - ここから先の導線は README.md に集約 - 詳細情報は各docsファイルへのリンクから辿る -- このファイルは500行以内を維持する +- このファイルは500行以内が目安(あくまで目安であり、必要に応じて増減可) - Phase 15セルフホスティング実装中!詳細は[Phase 15](docs/development/roadmap/phases/phase-15/)へ diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 3d632695..7b7905cb 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -41,6 +41,42 @@ Next(short — Parser MVP kick‑off) 3) スモーク: `tools/ny_roundtrip_smoke.sh` 緑、`esc_dirname_smoke`/`dep_tree_min_string` を Ny パーサ経路で PyVM/llvmlite とパリティ一致。 4) (続)Ny AST→MIR JSON 直接降下の設計(箱構造/型メタ連携)。 +Hot Update — 2025‑09‑14(Language + Docs) +- Parser/Tokenizer: + - 三項演算子(`cond ? then : else`)をパーサに導入(Phase 12.7 順序: Pipe の内側)。 + - 降下は PeekExpr(`peek cond { true => then, else => else }`)化で式として扱いやすく。 + - トークナイザに単独の `?` / `:` を追加(`.?`/`??` より後に評価)。 + - postfix `?`(Result伝播)と `?:` の衝突を回避(look‑ahead)。 + - `return` 後の改行/式を許容するよう改善(`return` + 三項の直後でも安全)。 + - 文パーサのフォールバックに「式文」を追加(式のみの行を受理、結果は捨てられる;`NYASH_LINT_MUSTUSE=1` で警告可)。 +- PeekExpr(確認): + - アームで `{ ... }` ブロックを許容、最後の式が値として返る(Program式として評価)。 + - 文コンテキストでも式文として利用可(値は破棄)。 +- Docs(入口の整備): + - 言語ガイド: `docs/guides/language-guide.md` + - 言語索引: `docs/reference/language/README.md` + - 安定パス(スタブ): `docs/reference/language/LANGUAGE_REFERENCE_2025.md`(private実体へ誘導) + - アーキ索引/受け皿: `docs/reference/architecture/{nyash_core_concepts.md, execution-backends.md, TECHNICAL_ARCHITECTURE_2025.md}` +- Parser MVP(Stage 1): + - Python 実装: `tools/ny_parser_mvp.py` を追加、Roundtrip スモーク `tools/ny_parser_mvp_roundtrip.sh` で緑。 + - Nyash 実装スケルトン: `apps/selfhost/parser/ny_parser_v0/main.nyash`(改修継続)。 + +Next(short — 言語/E2E) +1) 三項演算子のE2E確定(VM実行/戻り値表示まで緑)。 + - 例: `apps/tests/ternary_basic.nyash`(return 10) + - `tools/parity.sh` で PyVM/llvmlite と動作一致の確認(peek化経路含む)。 +2) peek サンプル/テスト拡充(式文/ブロック/戻り値) + - 例: `apps/tests/peek_expr_block.nyash` +3) ドキュメント追補 + - Language Guide に peek/三項の最小例・must_useメモを追記 + - Cheat Sheet に三項/peek を反映 +4) (継続)Parser MVP Stage2 設計: `local/if/loop/call/method/new/me/substring/length/lastIndexOf` + +Quick Commands(dev) +- Python Parser Roundtrip: `NYASH_CLI_VERBOSE=1 tools/ny_parser_mvp_roundtrip.sh` +- Peek Block サンプル(VM): `./target/release/nyash --backend vm apps/tests/peek_expr_block.nyash` +- E2E(言語 → MIR ダンプ): `./target/release/nyash --dump-mir apps/tests/peek_expr_block.nyash` + Hot Update — MIR v0.5 Type Metadata(2025‑09‑14 着手) - 背景: 文字列を i64 として曖昧に扱っており、llvmlite で handle/ptr の推測が必要→不安定の温床。 - 追加仕様(後方互換、最小差分): diff --git a/src/parser/expressions.rs b/src/parser/expressions.rs index 19875f8d..d3fe7fad 100644 --- a/src/parser/expressions.rs +++ b/src/parser/expressions.rs @@ -93,12 +93,12 @@ impl NyashParser { let then_expr = self.parse_expression()?; self.consume(TokenType::COLON)?; // ':' let else_expr = self.parse_expression()?; - // Lower to PeekExpr over boolean scrutinee: peek cond { true => then, else => else } - return Ok(ASTNode::PeekExpr { - scrutinee: Box::new(cond), - arms: vec![(crate::ast::LiteralValue::Bool(true), then_expr)], - else_expr: Box::new(else_expr), - span: Span::unknown(), + // Lower to If-expression AST (builder側でPhi化) + return Ok(ASTNode::If { + condition: Box::new(cond), + then_body: vec![then_expr], + else_body: Some(vec![else_expr]), + span: Span::Unknown, }); } Ok(cond) @@ -613,11 +613,14 @@ impl NyashParser { expr = ASTNode::Call { callee: Box::new(expr), arguments, span: Span::unknown() }; } } else if self.match_token(&TokenType::QUESTION) { - // 後置 ?(Result伝播)。ただし三項演算子 '?:' と衝突するため、次トークンが ':' の場合は消費しない。 - // 例: (cond) ? then : else ではここで '?' を処理せず、上位の parse_ternary に委ねる。 - if self.peek_token() == &TokenType::COLON { - break; - } + // 後置 ?(Result伝播)。三項 '?:' と衝突するため、 + // 次トークンが式開始(識別子/数値/括弧/文字列/true/false/null など)の場合は消費せず上位へ委譲。 + // ここでは「終端系(NEWLINE/EOF/)/, /})」のみ後置?を許容する。 + let nt = self.peek_token(); + let is_ender = matches!(nt, + TokenType::NEWLINE | TokenType::EOF | TokenType::RPAREN | TokenType::COMMA | TokenType::RBRACE + ); + if !is_ender { break; } self.advance(); expr = ASTNode::QMarkPropagate { expression: Box::new(expr), span: Span::unknown() }; } else {