use std::fmt;
#[derive(Debug, Clone)]
pub enum GrammarError {
ParseError(String),
UndefinedRule(String),
LeftRecursion(usize),
NoRootRule,
EmptyGrammar,
InvalidState(String),
InvalidStartRule(usize),
}
impl fmt::Display for GrammarError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
GrammarError::ParseError(msg) => write!(f, "parse error: {}", msg),
GrammarError::UndefinedRule(name) => write!(f, "undefined rule: '{}'", name),
GrammarError::LeftRecursion(idx) => {
write!(f, "left recursion detected at rule index {}", idx)
}
GrammarError::NoRootRule => write!(f, "grammar does not contain a 'root' rule"),
GrammarError::EmptyGrammar => write!(f, "grammar is empty"),
GrammarError::InvalidState(msg) => write!(f, "invalid state: {}", msg),
GrammarError::InvalidStartRule(idx) => {
write!(f, "start rule index {} out of bounds", idx)
}
}
}
}
impl std::error::Error for GrammarError {}