pub mod alt;
pub mod segmap;
pub mod char_reader;
pub mod fixed_sym_table;
pub mod log;
pub mod lexer;
pub mod parser;
pub mod text_span;
pub const CORE_PKG_NAME: &str = env!("CARGO_PKG_NAME");
pub const CORE_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
pub type TokenId = u16;
pub type VarId = u16;
pub type AltId = VarId;
pub trait CharLen {
fn charlen(&self) -> usize;
}
impl<T: AsRef<str>> CharLen for T {
fn charlen(&self) -> usize {
self.as_ref().chars().count()
}
}
pub trait CollectJoin {
fn join(&mut self, separator: &str) -> String
where Self: Iterator,
<Self as Iterator>::Item: ToString
{
self.map(|x| x.to_string()).collect::<Vec<_>>().join(separator)
}
fn to_vec(self) -> Vec<<Self as Iterator>::Item>
where Self: Iterator + Sized
{
self.collect::<Vec<_>>()
}
}
impl<I: Iterator> CollectJoin for I {}
pub mod macros {
#[macro_export]
macro_rules! opcode {
(e) => { $crate::parser::OpCode::Empty };
(t $id:expr) => { $crate::parser::OpCode::T($id as $crate::TokenId) };
(nt $id:expr) => { $crate::parser::OpCode::NT($id as $crate::VarId) };
(loop $id:expr) => { $crate::parser::OpCode::Loop($id as $crate::VarId) };
(exit $id:expr) => { $crate::parser::OpCode::Exit($id as $crate::VarId) };
(nt $id:expr) => { $crate::parser::OpCode::NT($id as $crate::VarId, 0) };
(loop $id:expr) => { $crate::parser::OpCode::Loop($id as $crate::VarId, 0) };
(exit $id:expr) => { $crate::parser::OpCode::Exit($id as $crate::VarId, 0) };
(hook) => { $crate::parser::OpCode::Hook };
(end) => { $crate::parser::OpCode::End };
}
#[macro_export]
macro_rules! strip {
() => { std::vec![] };
($($a:ident $($b:expr)?,)+) => { strip![$($a $($b)?),+] };
($($a:ident $($b:expr)?),*) => { std::vec![$($crate::opcode!($a $($b)?)),*] };
}
}