# ANCP Technical Specification v1.0

## 1. プロトコル概要

### 1.1 設計原則
- **可逆性**: 100%の双方向変換保証
- **効率性**: 50-70%のトークン削減
- **可読性**: 人間も慣れれば読み書き可能
- **拡張性**: バージョニングによる将来対応

### 1.2 プロトコルヘッダー
```
;ancp:1.0 nyash:0.5.0;
```
- `ancp:1.0`: ANCPプロトコルバージョン
- `nyash:0.5.0`: 対応Nyashバージョン

## 2. 記号マッピング仕様

### 2.1 予約語マッピング（優先度順）

#### Tier 1: 超高頻度（1文字）
| Nyash | ANCP | 頻度 | tiktoken削減 |
|-------|------|------|--------------|
| me | m | 極高 | 2→1 (50%) |
| new | n | 高 | 3→1 (67%) |
| return | r | 高 | 6→1 (83%) |
| local | l | 高 | 5→1 (80%) |

#### Tier 2: 高頻度（1文字特殊）
| Nyash | ANCP | 理由 |
|-------|------|------|
| box | $ | 金庫のメタファー |
| from | @ | 接続を表現 |
| init | # | 初期化のハッシュ |
| if | ? | 疑問・条件 |
| else | : | 条件の区切り |

#### Tier 3: 中頻度（1-2文字）
| Nyash | ANCP | 理由 |
|-------|------|------|
| static | S | 大文字で静的を表現 |
| loop | L | ループのL |
| birth | b | 誕生のb |
| override | O | 上書きのO |
| pack | p | パックのp |

### 2.2 演算子・記号の扱い
- 算術演算子（+, -, *, /）: そのまま
- 比較演算子（==, !=, <, >）: そのまま
- 論理演算子（and, or, not）: 検討中
  - `and` → `&`
  - `or` → `|`
  - `not` → `!`

### 2.3 複合パターン
```nyash
// 元のコード
box Cat from Animal {
    init { name, age }
}

// ANCP変換後
$Cat@Animal{#{name,age}}
```

## 3. パース規則

### 3.1 トークン境界
- 記号の前後に空白は不要（`$Cat`でOK）
- 識別子の区切りは既存ルール継承
- 文字列・コメント内は変換しない

### 3.2 優先順位
1. 文字列リテラル内: 変換なし
2. コメント内: 変換なし
3. 識別子の一部: 変換なし（`method_name`の`me`は変換しない）
4. 独立トークン: 変換対象

### 3.3 コンテキスト認識
```rust
enum TokenContext {
    Normal,           // 通常（変換対象）
    StringLiteral,    // 文字列内
    Comment,          // コメント内
    Identifier,       // 識別子の一部
}
```

## 4. 実装仕様

### 4.1 Transcoder API
```rust
pub trait AncpTranscoder {
    // 基本変換
    fn encode(&self, nyash: &str) -> Result<String, AncpError>;
    fn decode(&self, ancp: &str) -> Result<String, AncpError>;
    
    // ストリーミング変換
    fn encode_stream(&self, input: impl Read) -> impl Read;
    fn decode_stream(&self, input: impl Read) -> impl Read;
    
    // 位置情報保持
    fn encode_with_map(&self, nyash: &str) -> Result<(String, SourceMap), AncpError>;
    fn decode_with_map(&self, ancp: &str) -> Result<(String, SourceMap), AncpError>;
}
```

### 4.2 SourceMap仕様
```rust
pub struct SourceMap {
    mappings: Vec<Mapping>,
}

pub struct Mapping {
    // 元の位置
    original_line: u32,
    original_column: u32,
    original_token: String,
    
    // 変換後の位置
    generated_line: u32,
    generated_column: u32,
    generated_token: String,
}
```

### 4.3 エラーハンドリング
```rust
pub enum AncpError {
    // 構文エラー
    InvalidSyntax { position: Position, expected: String },
    
    // バージョン非互換
    VersionMismatch { required: Version, found: Version },
    
    // 変換不可能
    UnsupportedConstruct { construct: String, reason: String },
}
```

## 5. 統合仕様

### 5.1 Lexer統合
```rust
// Lexerに追加
pub enum InputDialect {
    Nyash,
    Ancp(Version),
}

impl Lexer {
    pub fn new_with_dialect(input: &str, dialect: InputDialect) -> Self {
        // ヘッダー検出で自動判定も可能
        let dialect = detect_dialect(input).unwrap_or(dialect);
        // ...
    }
}
```

### 5.2 CLI統合
```bash
# 変換コマンド
nyash --to-ancp input.hako > output.ancp
nyash --from-ancp input.ancp > output.hako

# 直接実行
nyash --dialect=ancp script.ancp

# フォーマット表示
nyash --view=ancp script.hako    # Nyashファイルをancp形式で表示
nyash --view=hybrid script.ancp   # 並列表示
```

### 5.3 VSCode統合
```typescript
// 言語サーバープロトコル拡張
interface AncpHoverInfo {
    original: string;      // Nyash形式
    compressed: string;    // ANCP形式
    savings: number;       // 削減率
}

// リアルタイム変換
interface AncpLens {
    showOriginal: boolean;
    showCompressed: boolean;
    showSavings: boolean;
}
```

## 6. テスト仕様

### 6.1 往復テスト
```rust
#[test]
fn roundtrip_all_constructs() {
    let test_cases = vec![
        // 基本構造
        "box Test { }",
        "box Child from Parent { }",
        
        // メソッド定義
        "birth() { me.x = 1 }",
        "override method() { from Parent.method() }",
        
        // 制御構造
        "if x == 1 { } else { }",
        "loop(i < 10) { i = i + 1 }",
        
        // 複雑な例
        include_str!("../examples/complex.hako"),
    ];
    
    for case in test_cases {
        let encoded = transcoder.encode(case).unwrap();
        let decoded = transcoder.decode(&encoded).unwrap();
        assert_eq!(case, decoded);
    }
}
```

### 6.2 トークン効率テスト
```rust
#[test]
fn measure_token_reduction() {
    let encoder = tiktoken::get_encoding("cl100k_base");
    
    let original = "box Cat from Animal { init { name } }";
    let ancp = "$Cat@Animal{#{name}}";
    
    let original_tokens = encoder.encode(original).len();
    let ancp_tokens = encoder.encode(ancp).len();
    
    let reduction = 1.0 - (ancp_tokens as f64 / original_tokens as f64);
    assert!(reduction >= 0.5); // 50%以上の削減を保証
}
```

### 6.3 エラー位置テスト
```rust
#[test]
fn error_position_mapping() {
    let ancp = "$Test{invalid syntax here}";
    let result = transcoder.decode_with_map(ancp);
    
    match result {
        Err(AncpError::InvalidSyntax { position, .. }) => {
            // エラー位置が正しくマッピングされているか
            assert_eq!(position.line, 1);
            assert_eq!(position.column, 14);
        }
        _ => panic!("Expected syntax error"),
    }
}
```

## 7. パフォーマンス目標

### 7.1 変換性能
- エンコード: 100MB/s以上
- デコード: 150MB/s以上
- メモリ使用: 入力サイズの2倍以内

### 7.2 実行時性能
- パース時間増加: 10%以内
- 実行時オーバーヘッド: なし（パース後は同一AST）

## 8. セキュリティ考慮事項

### 8.1 インジェクション対策
- ANCP記号が既存コードを破壊しないよう検証
- 文字列エスケープの適切な処理

### 8.2 バージョン互換性
- 古いANCPバージョンの適切なエラー表示
- 将来の拡張に備えた設計

## 9. 将来の拡張

### 9.1 ANCP v2.0候補
- 文脈依存圧縮（頻出パターンの動的割当）
- カスタム辞書サポート
- バイナリ形式（BANCTP）

### 9.2 AI特化拡張
- モデル別最適化プロファイル
- トークナイザー直接統合
- 意味保持圧縮

---

この仕様書は、ANCPの技術的実装の基準となる文書です。実装時はこの仕様に従い、必要に応じて更新してください。