#[derive(PartialEq, Eq, Debug, Clone)]
pub struct Terminal(pub String);
#[derive(PartialEq, Eq, Debug)]
pub struct Alternation {
pub concatenation: Concatenation,
pub identifier: Option<String>,
}
#[derive(PartialEq, Eq, Debug)]
pub enum RuleKind {
StructRule(StructRule),
RegexRule(RegRule),
}
#[derive(PartialEq, Eq, Debug)]
pub struct StructRule {
pub lhs: String,
pub rhs: Rhs,
}
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct Concatenation(pub Vec<ConcatKind>);
#[derive(PartialEq, Eq, Debug, Clone)]
pub enum ConcatKind {
Factor(Factor),
Include(Include),
}
#[derive(PartialEq, Eq, Debug, Clone)]
pub enum Factor {
Optional(Term), ZeroOrMore(Term), OneOrMore(Term), Term(Term),
}
impl Factor {
pub fn is_grouping(&self) -> bool {
matches!(
self,
Factor::Term(Term::Grouping(_))
| Factor::Optional(Term::Grouping(_))
| Factor::OneOrMore(Term::Grouping(_))
| Factor::ZeroOrMore(Term::Grouping(_))
)
}
pub fn is_metachar(&self) -> bool {
matches!(
self,
Factor::Term(Term::Metacharacter(_))
| Factor::Optional(Term::Metacharacter(_))
| Factor::OneOrMore(Term::Metacharacter(_))
| Factor::ZeroOrMore(Term::Metacharacter(_))
)
}
pub fn is_terminal(&self) -> bool {
matches!(
self,
Factor::Term(Term::Terminal(_))
| Factor::Optional(Term::Terminal(_))
| Factor::OneOrMore(Term::Terminal(_))
| Factor::ZeroOrMore(Term::Terminal(_))
)
}
}
#[derive(PartialEq, Eq, Debug, Clone)]
pub enum Term {
Terminal(Terminal), Grouping(Grouping), Metacharacter(Metacharacter), Ident(String), }
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct Include(pub Factor);
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct Grouping(pub Box<Concatenation>, pub Option<String>);
#[derive(PartialEq, Eq, Debug)]
pub struct Rhs(pub Vec<Alternation>);
#[derive(PartialEq, Eq, Debug)]
pub struct Specification(pub Vec<RuleKind>);
#[derive(PartialEq, Eq, Debug)]
pub struct RegRule {
pub lhs: String,
pub rhs: RegRhs,
}
#[derive(PartialEq, Eq, Debug)]
pub struct RegRhs(pub Vec<RegAlternation>);
#[derive(PartialEq, Eq, Debug)]
pub struct RegAlternation(pub RegConcatenation);
#[derive(PartialEq, Eq, Debug)]
pub struct RegConcatenation(pub Vec<RegFactor>);
#[derive(PartialEq, Eq, Debug)]
pub enum RegFactor {
Optional(RegTerm), ZeroOrMore(RegTerm), OneOrMore(RegTerm), Term(RegTerm),
}
#[derive(PartialEq, Eq, Debug)]
pub enum RegTerm {
Terminal(Terminal), Grouping(RegGrouping), Ident(String), Metacharacter(Metacharacter),
}
#[derive(PartialEq, Eq, Debug)]
pub struct RegGrouping(pub Box<RegRhs>, pub Option<String>);
#[derive(PartialEq, Eq, Debug, Clone)]
pub enum Metacharacter {
AllChars, Digits, NonDigits, AlphaNumericUnderscore, NonAlphaNumericUnderscore, Whitespace,
NonWhitespace,
SquareBrackets(Vec<char>),
ExcludingSquareBrackets(Vec<char>),
}