use crate::logic::grammar::Grammar;
use std::path::Path;
pub fn load_example_grammar(name: &str) -> Grammar {
let manifest_dir = env!("CARGO_MANIFEST_DIR");
let path = Path::new(manifest_dir)
.join("examples")
.join(format!("{}.auf", name));
let content = std::fs::read_to_string(&path)
.unwrap_or_else(|e| panic!("Failed to read {}: {}", path.display(), e));
Grammar::load(&content).unwrap_or_else(|e| panic!("Failed to load grammar '{}': {}", name, e))
}
pub fn load_inline_grammar(spec: &str) -> Grammar {
Grammar::load(spec).expect("Failed to load inline grammar")
}
pub mod grammars {
use super::*;
use std::sync::OnceLock;
static STLC: OnceLock<Grammar> = OnceLock::new();
static CLIKE: OnceLock<Grammar> = OnceLock::new();
static IMP: OnceLock<Grammar> = OnceLock::new();
static FUN: OnceLock<Grammar> = OnceLock::new();
pub fn stlc() -> &'static Grammar {
STLC.get_or_init(|| load_example_grammar("stlc"))
}
pub fn clike() -> &'static Grammar {
CLIKE.get_or_init(|| load_example_grammar("clike"))
}
pub fn imp() -> &'static Grammar {
IMP.get_or_init(|| load_example_grammar("imp"))
}
pub fn fun() -> &'static Grammar {
FUN.get_or_init(|| load_example_grammar("fun"))
}
}