use super::{Span, Spanned, Spanning}; use crate::impl_spanning; #[derive(Debug, PartialEq, Eq, Clone)] pub struct Grammar { pub productions: Vec>, } #[derive(Debug, PartialEq, Eq, Clone)] pub struct Production { pub lhs: Spanned, pub rhs: Spanned, } #[derive(Debug, PartialEq, Eq, Clone)] pub enum Expression { Alternative { first: Box>, second: Box>, rest: Vec>, }, Sequence { first: Box>, second: Box>, rest: Vec>, }, Optional(Box>), Repeated(Box>), Factor { count: Spanned, primary: Box>, }, Exception { subject: Box>, restriction: Box>, }, Nonterminal(String), Terminal(String), Special(String), Empty, } impl_spanning!(Grammar); impl_spanning!(Production); impl_spanning!(Expression);