#[derive(Clone, Debug, PartialEq)]
pub struct Grammar {
pub productions: Vec<Production>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Production {
pub index: Option<u32>,
pub lhs: Ident,
pub rhs: Expr,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Expr {
Choice(Vec<Expr>),
Sequence(Vec<Expr>),
Optional(Box<Expr>),
Repeat(Box<Expr>),
Group(Box<Expr>),
Atom(Atom),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Atom {
Terminal(String),
NonTerminal(Ident),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Ident(pub String);