pub enum Expr {
StringEq(String),
StringEqCI(String),
RuleRef(String),
CharOf(String),
Sequence(Vec<Expr>),
Alternation(Vec<Expr>),
Repetition(Box<Expr>),
Optional(Box<Expr>),
NotFollowedBy(Box<Expr>),
SideCondition(Box<Expr>, &'static str),
}Expand description
Intermediate representation of a BNF/EBNF expression. All instances are maintained in optimized form.
Variants§
StringEq(String)
A case-sensitive literal, formatted as "text".
StringEqCI(String)
A case-insensitive literal, formatted as "text"i.
RuleRef(String)
A reference to another named rule.
CharOf(String)
A character class, formatted as 'label'.
Sequence(Vec<Expr>)
Concatenation: A B C.
Alternation(Vec<Expr>)
Alternation: A | B | C.
Repetition(Box<Expr>)
Zero or more repetitions: { A }.
Optional(Box<Expr>)
Zero or one: [ A ].
NotFollowedBy(Box<Expr>)
Negative lookahead: !A.
SideCondition(Box<Expr>, &'static str)
A side-condition beyond the shown syntax: A ^1 (see Expr::side_conditions).
Implementations§
Source§impl Expr
impl Expr
Sourcepub fn empty() -> Expr
pub fn empty() -> Expr
Matches nothing; omitted from formatted output. Represented as an
empty Sequence rather than its own variant, since
format_list already renders one as nothing.
Sourcepub fn sequence(exprs: Vec<Expr>) -> Expr
pub fn sequence(exprs: Vec<Expr>) -> Expr
Create a sequence, automatically flattening nested sequences.
Sourcepub fn alternation(exprs: Vec<Expr>) -> Expr
pub fn alternation(exprs: Vec<Expr>) -> Expr
Create an alternation, automatically flattening.
Sourcepub fn repetition(expr: Expr) -> Expr
pub fn repetition(expr: Expr) -> Expr
Create a repetition, dropping any hidden (Empty) elements first; an
entirely-hidden inner expression vanishes rather than showing as { }.
Sourcepub fn optional(expr: Expr) -> Expr
pub fn optional(expr: Expr) -> Expr
Create an optional, dropping any hidden (Empty) elements first; an
entirely-hidden inner expression vanishes rather than showing as [ ].
Sourcepub fn side_condition(expr: Expr, text: &'static str) -> Expr
pub fn side_condition(expr: Expr, text: &'static str) -> Expr
Attach a side-condition to expr, reported as a numbered marker —
see Expr::side_conditions.
Sourcepub fn side_conditions(&self) -> Vec<&'static str>
pub fn side_conditions(&self) -> Vec<&'static str>
This expression’s SideCondition texts, deduplicated by string
equality, in first-occurrence order — the same order format numbers their ^1, ^2, … markers. Callers print
these as footnotes after the formatted expression.
Sourcepub fn format(&self, f: &mut dyn Write) -> Result
pub fn format(&self, f: &mut dyn Write) -> Result
Format this expression as EBNF. Each SideCondition renders as a
numbered marker (^1, ^2, …) rather than its text — see
side_conditions for the footnotes to print
alongside.
Trait Implementations§
impl Eq for Expr
impl StructuralPartialEq for Expr
Auto Trait Implementations§
impl Freeze for Expr
impl RefUnwindSafe for Expr
impl Send for Expr
impl Sync for Expr
impl Unpin for Expr
impl UnsafeUnpin for Expr
impl UnwindSafe for Expr
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more