#[derive(Debug, Clone, PartialEq)]
pub struct Grammar {
pub definitions: Vec<Def>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Def {
Rule(Label, Cat, Vec<Item>),
Macro(Ident, Vec<Exp>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Item {
Terminal(String),
NTerminal(Cat),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Cat {
ListCat(Box<Cat>),
IdCat(Ident),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Exp {
Var(Ident),
LitInt(i64),
LitDouble(f64),
LitChar(char),
LitString(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Label {
Id(Ident),
Wild,
ListE,
ListCons,
ListOne,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Ident(pub String);