# 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