#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SymbolId(pub(crate) u32);
impl SymbolId {
pub const EOF: SymbolId = SymbolId(0);
#[doc(hidden)]
pub const fn new(id: u32) -> Self {
SymbolId(id)
}
}
use alloc::string::String;
use alloc::vec::Vec;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Grammar {
pub start: String,
pub expect_rr: usize,
pub expect_sr: usize,
pub terminals: Vec<TerminalDef>,
pub rules: Vec<Rule>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TerminalKind {
Plain,
Prec,
Shift,
Reduce,
Conflict,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TerminalDef {
pub name: String,
pub has_type: bool,
pub kind: TerminalKind,
pub pattern: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Rule {
pub name: String,
pub alts: Vec<Alt>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Alt {
pub terms: Vec<Term>,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Term {
Symbol(String),
Optional(String),
ZeroOrMore(String),
OneOrMore(String),
SeparatedBy { symbol: String, sep: String },
Empty,
}