pasta_core
Pasta DSL のパーサーとレジストリを提供する言語非依存層クレートです。
概要
pasta_core は Pasta DSL の構文解析とシーン/単語テーブル管理を担当します。
バックエンド(Lua等)に依存しない純粋なパーサーとデータ構造を提供し、複数のランタイムで再利用可能です。
アーキテクチャ
pasta_core
├── Parser # DSL → AST 変換(Pest PEG)
├── Registry # シーン/単語テーブル管理
│ ├── SceneRegistry # シーン登録(Pass 1)
│ ├── WordDefRegistry # 単語定義登録
│ ├── SceneTable # シーン検索(Radix Trie)
│ └── WordTable # 単語検索
└── Error # パースエラー型定義
ディレクトリ構成
pasta_core/
├── Cargo.toml
└── src/
├── lib.rs # クレートエントリーポイント
├── error.rs # ParseError, SceneTableError, WordTableError
├── parser/ # パーサーレイヤー
│ ├── mod.rs # パーサーAPI(parse_str, parse_file)
│ ├── ast.rs # AST定義(PastaFile, FileItem, Statement等)
│ └── grammar.pest # Pest PEG文法定義
└── registry/ # 型管理レイヤー
├── mod.rs # Registry API
├── scene_registry.rs # SceneRegistry
├── word_registry.rs # WordDefRegistry
├── scene_table.rs # SceneTable(Radix Trie)
├── word_table.rs # WordTable
└── random.rs # RandomSelector インターフェース
公開API
Parser
| 関数/型 |
説明 |
parse_str(source, filename) |
文字列からパース |
parse_file(path) |
ファイルからパース |
PastaFile |
パース結果(ASTルート) |
FileItem |
ファイル直下の項目(GlobalSceneScope, WordDef等) |
Registry
| 型 |
説明 |
SceneRegistry |
シーン登録・管理(Pass 1) |
WordDefRegistry |
単語定義登録 |
SceneTable |
シーン検索(完全一致 + 前方一致) |
WordTable |
単語検索 |
SceneEntry |
シーン情報エントリ |
WordEntry |
単語情報エントリ |
Random
| 型 |
説明 |
RandomSelector |
ランダム選択トレイト |
DefaultRandomSelector |
本番用ランダム実装 |
MockRandomSelector |
テスト用固定選択実装 |
使用例
基本的なパース
use pasta_core::parser::{parse_str, FileItem, PastaFile};
let source = r#"
*挨拶
Alice:こんにちは
Bob:やあ!
"#;
let ast = parse_str(source, "example.pasta").unwrap();
let scene_count = ast.items.iter()
.filter(|i| matches!(i, FileItem::GlobalSceneScope(_)))
.count();
println!("Parsed {} global scenes", scene_count);
シーンテーブルの構築
use pasta_core::registry::{SceneTable, SceneEntry, SceneId, SceneScope, DefaultRandomSelector};
let mut table = SceneTable::new();
let entry = SceneEntry {
id: SceneId(0),
name: "挨拶".to_string(),
scope: SceneScope::Global,
file_path: "example.pasta".to_string(),
};
table.insert(entry);
let selector = DefaultRandomSelector::new();
if let Some(scene) = table.get_exact("挨拶", &selector) {
println!("Found scene: {:?}", scene);
}
前方一致検索
use pasta_core::registry::{SceneTable, DefaultRandomSelector};
let selector = DefaultRandomSelector::new();
if let Some(scene) = table.get_prefix("挨拶", &selector) {
println!("Selected: {:?}", scene);
}
依存関係
| クレート |
バージョン |
用途 |
| pest |
2.8 |
PEGパーサー |
| pest_derive |
2.8 |
パーサー生成マクロ |
| thiserror |
2 |
エラー型定義 |
| fast_radix_trie |
1.1.0 |
前方一致検索(SceneTable) |
| rand |
0.9 |
ランダム選択 |
| tracing |
0.1 |
ロギング・診断 |
関連クレート
ライセンス
プロジェクトルートの LICENSE ファイルを参照してください。