# pasta_dsl

**Pasta DSL - Independent DSL parser and AST definitions**

Pasta DSLの独立パーサークレート。Luaバックエンドやレジストリに依存せず、DSL文法解析とAST型定義のみを提供します。

## Purpose

- Pasta DSLスクリプトを解析してAST（抽象構文木）に変換
- 外部開発者がpasta_dslのみを依存に追加してDSL解析を利用可能
- 新しいバックエンド実装（Lua以外）を容易にする

## Features

- **PEG文法パーサー**: Pest 2.8による堅牢な文法駆動パーサー
- **完全なAST型定義**: `PastaFile`, `FileItem`, `GlobalSceneScope`, `Action` 等
- **独立エラー型**: `ParseError`, `ParseErrorInfo` による詳細なパース診断
- **ゼロバックエンド依存**: Lua、レジストリ、ランタイムへの依存なし
- **ステートレス**: 複数スレッドから安全に呼び出し可能

## Usage

```rust
use pasta_dsl::parser::{parse_str, FileItem};

let source = "＊挨拶\n  Alice：こんにちは\n";
let ast = parse_str(source, "test.pasta").unwrap();

for item in &ast.items {
    match item {
        FileItem::FileAttr(attr) => println!("Attr: {}", attr.key),
        FileItem::GlobalWord(word) => println!("Word: {}", word.name),
        FileItem::GlobalSceneScope(scene) => println!("Scene: {}", scene.name),
        FileItem::ActorScope(actor) => println!("Actor: {}", actor.name),
    }
}
```

## Public API

### Parse Functions

- `parse_str(source, filename)` — 文字列からDSLをパース
- `parse_file(path)` — ファイルからDSLをパース

### AST Types

- `PastaFile` — ファイル全体のAST
- `FileItem` — ファイルレベルアイテム（属性、単語定義、シーン、アクター）
- `GlobalSceneScope` — グローバルシーン定義
- `LocalSceneScope` — ローカルシーン定義
- `ActorScope` — アクター定義
- `Action` — アクション（Talk, WordRef, VarRef, FnCall, SakuraScript, Escape）
- `Span` — ソース位置情報（行/列 + バイトオフセット）

### Error Types

- `ParseError` — パースエラー（SyntaxError, PestError, IoError, MultipleErrors）
- `ParseErrorInfo` — 個別パースエラー情報
- `ParseResult<T>` — `Result<T, ParseError>` エイリアス

## Dependencies

| クレート    | バージョン | 用途                 |
| ----------- | ---------- | -------------------- |
| pest        | 2.8        | PEG文法解析エンジン  |
| pest_derive | 2.8        | ビルド時パーサー生成 |
| thiserror   | 2          | エラー型生成マクロ   |

**注**: レジストリ関連（fast_radix_trie, rand）やLuaランタイム（mlua）への依存は一切ありません。

## Architecture

```
pasta_dsl
├── src/
│   ├── lib.rs               # クレートエントリーポイント
│   ├── error.rs             # ParseError, ParseErrorInfo, ParseResult
│   └── parser/
│       ├── mod.rs           # パーサーAPI（parse_str, parse_file）
│       ├── parse_scene.rs   # シーン解析
│       ├── parse_action.rs  # アクション解析
│       ├── parse_elements.rs # 要素解析
│       ├── ast/             # AST型定義（ディレクトリ）
│       │   ├── mod.rs       # AST公開エントリ
│       │   ├── span.rs      # Span型定義
│       │   ├── scene.rs     # シーン関連AST
│       │   └── action.rs    # アクション関連AST
│       └── grammar.pest     # Pest文法定義（権威的仕様）
└── tests/
    ├── actor_code_block_test.rs   # アクターコードブロック解析テスト
    ├── ast_test.rs                # AST型テスト
    ├── digit_id_var_test.rs       # 全角数字変数テスト
    ├── parser_test.rs             # パーサー統合テスト
    ├── sakura_symbol_tag_test.rs  # さくらスクリプト記号タグテスト
    └── span_byte_offset_test.rs   # バイトオフセットテスト
```

## License

MIT OR Apache-2.0
