blob: f23194914188396283d79cbd14975044c0b5562e [file] [edit]
use super::{Expression, ExpressionKind};
use std::fmt::{Display, Formatter};
impl Display for Expression {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
match &self.kind {
ExpressionKind::Grouped(e) => write!(f, "({e})")?,
ExpressionKind::Alt(es) => {
for (i, e) in es.iter().enumerate() {
if i > 0 {
write!(f, " | ")?;
}
write!(f, "{e}")?;
}
}
ExpressionKind::Sequence(es) => {
for (i, e) in es.iter().enumerate() {
if i > 0 {
write!(f, " ")?;
}
write!(f, "{e}")?;
}
}
ExpressionKind::Optional(e) => write!(f, "{e}?")?,
ExpressionKind::NegativeLookahead(e) => write!(f, "!{e}")?,
ExpressionKind::Repeat(e) => write!(f, "{e}*")?,
ExpressionKind::RepeatPlus(e) => write!(f, "{e}+")?,
ExpressionKind::RepeatRange {
expr,
name,
min,
max,
limit,
} => write!(
f,
"{expr}{{{}{}{limit}{}}}",
name.as_ref().map(|n| format!("{n}:")).unwrap_or_default(),
min.map(|v| v.to_string()).unwrap_or_default(),
max.map(|v| v.to_string()).unwrap_or_default(),
)?,
ExpressionKind::RepeatRangeNamed(e, name) => write!(f, "{e}{{{name}}}")?,
ExpressionKind::Nt(s) => write!(f, "{s}")?,
ExpressionKind::Terminal(s) => write!(f, "`{s}`")?,
ExpressionKind::Prose(s) => write!(f, "<{s}>")?,
ExpressionKind::Break(_) => write!(f, " ")?,
ExpressionKind::Comment(_) => {}
ExpressionKind::Charset(es) => {
write!(f, "[")?;
for (i, e) in es.iter().enumerate() {
if i > 0 {
write!(f, " ")?;
}
write!(f, "{e}")?;
}
write!(f, "]")?;
}
ExpressionKind::CharacterRange(start, end) => write!(f, "{start}-{end}")?,
ExpressionKind::NegExpression(e) => write!(f, "~{e}")?,
ExpressionKind::Cut(e) => write!(f, "^ {e}")?,
ExpressionKind::Unicode((_, s)) => write!(f, "U+{s}")?,
}
if let Some(suffix) = &self.suffix {
write!(f, " _{suffix}_")?;
}
Ok(())
}
}