use super::Action;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Production {
pub lhs: u32,
pub rhs_len: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LrTables {
pub num_states: u32,
pub num_tokens: u32,
pub num_nonterminals: u32,
pub action: &'static [u32],
pub goto: &'static [u32],
pub productions: &'static [Production],
}
impl LrTables {
#[must_use]
#[inline]
pub fn action_at(&self, state: u32, token: u32) -> Action {
let idx = (state * self.num_tokens + token) as usize;
Action::unpack(self.action[idx])
}
#[must_use]
#[inline]
pub fn goto_at(&self, state: u32, nt: u32) -> u32 {
let idx = (state * self.num_nonterminals + nt) as usize;
self.goto[idx]
}
}