feat: IDENTIFIERキーをデフォルトで有効化 - DX大幅改善!
- primary.rs: sugar_level != "basic"でIDENTIFIERキーを許可
- デフォルトで {name: "value"} のようなモダンな構文が使える
- NYASH_SYNTAX_SUGAR_LEVEL=basic で厳密モード(文字列キーのみ)
- 環境変数なしで複数行match式が完全動作
- エラーメッセージも改善(basicモード時に解決方法を提示)
これでPhase 15セルフホスティングの開発が快適に!
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
10
CLAUDE.md
10
CLAUDE.md
@ -397,12 +397,16 @@ jq '.functions[0].blocks' mir.json # ブロック構造確認
|
|||||||
- 🗃️ **アーカイブ整理**: 古いphaseファイル群をarchiveに移動、導線クリーンアップ完了
|
- 🗃️ **アーカイブ整理**: 古いphaseファイル群をarchiveに移動、導線クリーンアップ完了
|
||||||
- 📋 詳細: [Property System仕様](docs/proposals/unified-members.md) | [Python統合計画](docs/development/roadmap/phases/phase-10.7/)
|
- 📋 詳細: [Property System仕様](docs/proposals/unified-members.md) | [Python統合計画](docs/development/roadmap/phases/phase-10.7/)
|
||||||
|
|
||||||
## 📝 Update (2025-09-24) ✅ 改行処理Phase 0 & Phase 1基本実装完了!
|
## 📝 Update (2025-09-24) ✅ 改行処理実装&IDENTIFIERキーのデフォルト化!
|
||||||
|
- ✅ **IDENTIFIERキーがデフォルトで使える!** 環境変数不要で快適開発
|
||||||
|
- **変更前**: `NYASH_SYNTAX_SUGAR_LEVEL=full`が必須(面倒)
|
||||||
|
- **変更後**: デフォルトで`{name: "value"}`が書ける!
|
||||||
|
- **厳密モード**: `NYASH_SYNTAX_SUGAR_LEVEL=basic`で文字列キーのみに制限可能
|
||||||
|
- **実装**: `primary.rs`で`sugar_level != "basic"`をデフォルト判定
|
||||||
- ✅ **Phase 0 Quick Fix完了!** たった5箇所の修正で複数行オブジェクトリテラル完全動作
|
- ✅ **Phase 0 Quick Fix完了!** たった5箇所の修正で複数行オブジェクトリテラル完全動作
|
||||||
- `primary.rs`: COLON前後とCOMMA判定前にskip_newlines()追加(3箇所)
|
- `primary.rs`: COLON前後とCOMMA判定前にskip_newlines()追加(3箇所)
|
||||||
- `match_expr.rs`: is_object_literal()関数を改行対応(lookahead改良)
|
- `match_expr.rs`: is_object_literal()関数を改行対応(lookahead改良)
|
||||||
- **必須環境変数**: `NYASH_SYNTAX_SUGAR_LEVEL=full`(IDENTIFIERキー使用のため)
|
- **テスト結果**: MapBox正常出力(環境変数なしで動作!)
|
||||||
- **テスト結果**: MapBox正常出力 `{'__box__': 'MapBox', '__map': {'value': 42, 'name': 'answer'}}`
|
|
||||||
- 🎯 **Phase 1 TokenCursor基本実装完了!** 改行処理を一元管理する仕組み構築
|
- 🎯 **Phase 1 TokenCursor基本実装完了!** 改行処理を一元管理する仕組み構築
|
||||||
- **新規実装ファイル**:
|
- **新規実装ファイル**:
|
||||||
1. `src/parser/cursor.rs`: TokenCursor本体(230行)- モード制御・深度追跡・自動改行処理
|
1. `src/parser/cursor.rs`: TokenCursor本体(230行)- モード制御・深度追跡・自動改行処理
|
||||||
|
|||||||
@ -43,9 +43,10 @@ impl NyashParser {
|
|||||||
self.advance();
|
self.advance();
|
||||||
let mut entries: Vec<(String, ASTNode)> = Vec::new();
|
let mut entries: Vec<(String, ASTNode)> = Vec::new();
|
||||||
let sugar_level = std::env::var("NYASH_SYNTAX_SUGAR_LEVEL").ok();
|
let sugar_level = std::env::var("NYASH_SYNTAX_SUGAR_LEVEL").ok();
|
||||||
|
// デフォルトでIDENTIFIERキーを許可(basicが明示的に指定された場合のみ無効)
|
||||||
let ident_key_on = std::env::var("NYASH_ENABLE_MAP_IDENT_KEY").ok().as_deref()
|
let ident_key_on = std::env::var("NYASH_ENABLE_MAP_IDENT_KEY").ok().as_deref()
|
||||||
== Some("1")
|
== Some("1")
|
||||||
|| sugar_level.as_deref() == Some("full");
|
|| sugar_level.as_deref() != Some("basic"); // basic以外は全て許可(デフォルト含む)
|
||||||
self.skip_newlines();
|
self.skip_newlines();
|
||||||
while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() {
|
while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() {
|
||||||
self.skip_newlines();
|
self.skip_newlines();
|
||||||
@ -67,7 +68,7 @@ impl NyashParser {
|
|||||||
expected: if ident_key_on {
|
expected: if ident_key_on {
|
||||||
"string or identifier key in map literal".to_string()
|
"string or identifier key in map literal".to_string()
|
||||||
} else {
|
} else {
|
||||||
"string key in map literal".to_string()
|
"string key in map literal (set NYASH_SYNTAX_SUGAR_LEVEL=full for identifier keys)".to_string()
|
||||||
},
|
},
|
||||||
line,
|
line,
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user