# EBNFとTokens.mdの比較レポート

`docs/dev/grammar.ebnf` (EBNF定義) から抽出したトークン一覧と、既存の `docs/dev/tokens.md` (Lexer定義) を比較し、差異をまとめました。

## 1. 概要
EBNFは言語の構文構造を定義していますが、Lexer (`lexer.rs` / `tokens.md`) で定義されている一部のトークン（未使用の演算子や将来用の型など）が含まれていません。逆に、EBNFで使用されている一部のキーワードが `tokens.md` に記載漏れ（あるいはLexer定義漏れ）している可能性があります。

## 2. 詳細な差異

### A. キーワード (Keywords)

| トークン | EBNF (Grammar) | Tokens.md (Lexer) | 状態 | 備考 |
| :--- | :--- | :--- | :--- | :--- |
| `pub` | ❌ なし | ✅ あり | **不一致** | EBNFに可視性修飾子の定義がありません。 |
| `tensor` | ✅ あり | ❌ なし | **不一致** | `tensor` 宣言や型で使用されていますが、Tokens.mdには記載がありません (識別子扱いされている可能性あり)。 |

### B. プリミティブ型 (Types)

型の定義に大きな食い違いが見られます。

| 型名 | EBNF (Grammar) | Tokens.md (Lexer) | 状態 | 備考 |
| :--- | :--- | :--- | :--- | :--- |
| `u8` | ✅ あり | ❌ なし | **不一致** | TLで `u8` をサポートする意図がある場合、Lexerに追加が必要です。 |
| `i64` / `f64` | ✅ あり | ✅ あり | 一致 | - |
| `bool` | ✅ あり | ✅ あり | 一致 | - |
| `void` | ✅ あり | ✅ あり | 一致 | - |
| `string` vs `String` | `"string"` (小文字) | `"String"` (大文字) | **不一致** | EBNFは小文字、Lexerは大文字です。 |
| `f32` | ❌ なし | ✅ あり | **不一致** | EBNFに含まれていません。 |
| `i32` | ❌ なし | ✅ あり | **不一致** | EBNFに含まれていません。 |
| `usize` | ❌ なし | ✅ あり | **不一致** | EBNFに含まれていません。 |
| `Char` | ❌ なし | ✅ あり | **不一致** | EBNFに含まれていません。 |

### C. 演算子・記号 (Operators & Symbols)

一部の演算子がEBNFで使用されていません。

| 記号 | EBNF (Grammar) | Tokens.md (Lexer) | 状態 | 備考 |
| :--- | :--- | :--- | :--- | :--- |
| `&` (Bitwise AND) | ❌ なし | ✅ あり | **不一致** | 論理積 `&&` はありますが、ビット演算 `&` がEBNFにありません。 |
| `^` (Bitwise XOR) | ❌ なし | ✅ あり | **不一致** | EBNFにありません。 |
| `..` (Range) | ❌ なし | ✅ あり | **不一致** | 範囲指定構文がEBNFにありません。 |
| `$` | ❌ なし | ✅ あり | **不一致** | EBNFにありません。 |
| `?` | ❌ なし | ✅ あり | **不一致** | EBNFではメタ文字として使用されていますが、言語のトークンとしては出現しません。 |

### D. リテラル (Literals)

| リテラル種別 | EBNF (Grammar) | Tokens.md (Lexer) | 状態 | 備考 |
| :--- | :--- | :--- | :--- | :--- |
| `CharLiteral` | ❌ なし | ✅ あり | **不一致** | `'a'` のような文字リテラルがEBNF定義に含まれていません。 |

## 3. 考察と推奨アクション

1.  **`tensor` キーワード**: Lexerで明示的に定義されていない場合、識別子としてパースされている可能性があります。予約語として扱うべきか確認が必要です。
2.  **型の不一致**: `u8` のサポート有無、および `string` vs `String` のケーシングについて仕様を統一する必要があります。
3.  **未使用トークン**: `pub`, `&`, `^`, `..` などは、将来の拡張用か、EBNFの記述漏れかのいずれかです。実装状況に合わせてEBNFを更新するか、Lexerから削除（または無視）する必要があります。

以上が比較結果となります。
