LR構文解析(LR(0))法のRust実装
このプロジェクトは、LR(0)構文解析器をRustで実装し、GUI付きのパーサー・ジェネレーターアプリケーションを提供します。
- LR(0)構文解析: 文法規則に基づくパース処理
- AST生成: 抽象構文木の自動生成
- GUIインターフェース: 直感的な操作が可能
- コードジェネレーター: ASTから実行可能なRustコードを生成
- 終端記号の型設定: 各終端記号に対する型の選択機能
GUIアプリケーションを起動:
cargo run --bin lr0-parser-guiコマンドライン版の実行:
cargo run- Production: 生成規則を入力(デフォルト: 数式文法)
- Target String: パースしたい文字列を入力
- Parse: パース処理を実行してASTを生成
- Terminal Symbols: 終端記号の一覧と型選択
- Generate Code: ASTから実行可能なRustコードを生成
- Generate Result: 生成されたコードの表示
->で左辺と右辺を区切る- 右辺の空白文字は自動的に除去される
- 非終端記号: 大文字(A, B, E など)
- 終端記号: 小文字・数字・記号(+, *, 0, 1 など)
E -> E*B
E -> E+B
E -> B
B -> 0
B -> 1
この文法は以下を表現:
E: 式(Expression)B: 基本項(Basic term)*: 乗算演算子+: 加算演算子0,1: 数値リテラル
Generatorページで各終端記号に以下の型を設定可能:
- Add: 加算演算子として扱う
- Mul: 乗算演算子として扱う
- L_paren: 左括弧として扱う
- R_paren: 右括弧として扱う
- Num: 数値リテラルとして扱う
- Production:
E -> E+B\nE -> B\nB -> 0\nB -> 1 - Target String:
1+0 - 終端記号の型:
+→Add,1→Num,0→Num
// Generated Rust code from AST
fn main() {
let result_1 = (1 + 0); // Evaluated expression
println!("Result: {}", result_1);
}src/
├── main.rs # エントリーポイント
├── lib.rs # LR(0)パーサーのコア実装
├── app.rs # GUIアプリケーションのメイン構造体
└── pages/
├── mod.rs # ページモジュールの宣言
├── parser.rs # Parserページの実装
└── generator.rs # Generatorページの実装
eframe: GUIフレームワーク(egui)
- Rust 1.70以上
- Cargo
git clone https://github.com/raiga0310/LR_parser.git
cd LR_parsercargo build# GUI版
cargo run --bin lr0-parser-gui
# CLI版
cargo runcargo testsrc/
├── main.rs # エントリーポイント
├── lib.rs # ライブラリルート
├── app.rs # メインアプリケーション構造体
├── generator_engine.rs # コード生成エンジン
└── pages/ # UIページモジュール
├── mod.rs # ページモジュール管理
├── parser.rs # パーサーページUI
└── generator.rs # ジェネレーターページUI
- app.rs: GUI状態管理とページ切り替え
- generator_engine.rs: AST解析、コード生成、実行処理
- pages/parser.rs: パーサーページのUI処理
- pages/generator.rs: ジェネレーターページのUI処理