use core::fmt;
use gramatika::{DebugLisp, Span, Substr, Token as _, TokenStream};
#[derive(Token, DebugLispToken)]
pub enum Chunk {
#[pattern = r"[ \t]*#define .+"]
Definition(Substr, Span),
#[pattern = r"[ \t]*#if(n?def)? .+"]
BranchStart(Substr, Span),
#[pattern = r"[ \t]*#else .+"]
#[pattern = r"[ \t]*#else"]
BranchFork(Substr, Span),
#[pattern = r"[ \t]*#endif .+"]
#[pattern = r"[ \t]*#endif"]
BranchEnd(Substr, Span),
#[pattern = r".+"]
Line(Substr, Span),
}
pub type Lexer = TokenStream<Chunk>;
impl fmt::Debug for Chunk {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
DebugLisp::fmt(self, f, 0)
}
}
impl fmt::Display for Chunk {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.lexeme())
}
}