toktok_macros 0.2.1

toktok - WIP
Documentation
#[derive(Debug)]
pub struct Ast<'a> {
    pub items: Vec<Item<'a>>,
}

#[derive(Debug)]
pub enum Item<'a> {
    UseStatement(UseStatement<'a>),
    Config(Config<'a>),
    Rule(Rule<'a>),
}

#[derive(Debug)]
pub struct UseStatement<'a>(pub &'a str);

#[derive(Debug)]
pub struct Config<'a> {
    pub name: Path<'a>,
    pub value: ConfigValue<'a>,
}

#[derive(Debug, PartialEq)]
pub enum ConfigValue<'a> {
    Array(Vec<ConfigValue<'a>>),
    Token(Token<'a>),
}

#[derive(Debug)]
pub struct Rule<'a> {
    pub is_public: bool,
    pub name: Ident<'a>,
    pub ret_type: RetType<'a>,
    pub productions: Vec<Production<'a>>,
}

#[derive(Debug)]
pub struct Production<'a> {
    pub combinator: CombinatorSeq<'a>,
    pub rust_expression: RustExpression<'a>,
    pub is_fallible: bool,
    #[expect(unused)]
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub enum Combinator<'a> {
    Seq(CombinatorSeq<'a>),
    Choice(CombinatorChoice<'a>),
    Opt(CombinatorOpt<'a>),
    Many0(CombinatorMany0<'a>),
    Many1(CombinatorMany1<'a>),
    Atom(CombinatorAtom<'a>),
}

impl<'a> Combinator<'a> {
    pub fn source(&self) -> &'a str {
        match self {
            Combinator::Seq(c) => c.source,
            Combinator::Choice(c) => c.source,
            Combinator::Opt(c) => c.source,
            Combinator::Many0(c) => c.source,
            Combinator::Many1(c) => c.source,
            Combinator::Atom(c) => c.source,
        }
    }
}

#[derive(Debug, PartialEq)]
pub struct CombinatorSeq<'a> {
    pub combinators: Vec<Combinator<'a>>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub struct CombinatorChoice<'a> {
    pub combinators: Vec<Combinator<'a>>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub struct CombinatorOpt<'a> {
    pub combinator: Box<Combinator<'a>>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub struct CombinatorMany0<'a> {
    pub combinator: Box<Combinator<'a>>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub struct CombinatorMany1<'a> {
    pub combinator: Box<Combinator<'a>>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub struct CombinatorAtom<'a> {
    pub kind: CombinatorAtomKind<'a>,
    pub source: &'a str,
}

#[derive(Debug, PartialEq)]
pub enum CombinatorAtomKind<'a> {
    Token(Token<'a>),
    Path(Path<'a>),
    FunctionCall(FunctionCall<'a>),
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Token<'a> {
    TokenLit(TokenLit<'a>),
    TokenRegex(TokenRegex<'a>),
}

#[derive(Debug, PartialEq)]
pub struct FunctionCall<'a> {
    pub name: Path<'a>,
    pub args: Vec<Combinator<'a>>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct RetType<'a>(pub &'a str);

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct RustExpression<'a>(pub &'a str);

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TokenLit<'a>(pub &'a str);

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TokenRegex<'a>(pub &'a str);

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Path<'a>(pub &'a str);

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Ident<'a>(pub &'a str);