#[derive(Clone, Copy, Default)]
pub struct State {
pub is_directive: bool,
pub is_include: bool,
}
#[derive(Debug, Clone, Copy, logos::Logos, PartialEq, Eq)]
#[logos(extras = State)]
#[logos(subpattern o = "[0-7]")]
#[logos(subpattern d = "[0-9]")]
#[logos(subpattern nz = "[1-9]")]
#[logos(subpattern h = "[a-fA-F0-9]")]
#[logos(subpattern hp = "0[xX]")]
#[logos(subpattern b = "[01]")]
#[logos(subpattern bp = "0[bB]")]
#[logos(subpattern e = "[eE][+-]?(?&d)+")]
#[logos(subpattern p = "[pP][+-]?(?&d)+")]
#[logos(subpattern fs = "[fFlL]")]
#[logos(subpattern is = "([uU]([lL]|ll|LL)?)|(([lL]|ll|LL)[uU]?)")]
#[logos(subpattern l = "[a-zA-Z_$]")]
#[logos(subpattern a = "[a-zA-Z_$0-9]")]
#[logos(subpattern cp = r"[uUL]")]
#[logos(subpattern sp = r"u8|(?&cp)")]
#[logos(subpattern ws = r"[ \t\v\r\n\f]")]
#[logos(subpattern es = r#"[\\](['"%?\\abefnrtv]|[0-7]+|[xu][a-fA-F0-9]+|[\r]?[\n])"#)]
pub enum Token {
#[regex("//[^\r\n]*")]
#[token("/*", |lex| {
lex.bump(lex.remainder().find("*/")? + 2);
Some(())
})]
Comment,
#[regex(r"\.\.\.")]
#[regex(r">>=|<<=|[+]=|-=|[*]=|/=|%=|&=|[\^]=|\|=")]
#[regex(r">>|<<|[+][+]|--|->|&&|[|][|]|<=|>=|==|!=|<%|%>|<:|:>")]
#[regex(r"[;{},:=()\[\].&!~\-+*/%<>^|?\\#]")]
Symbol,
#[regex(r"(?&cp)?'([^'\\\n]|(?&es))*'")]
Char,
#[regex(r#"((?&sp)?"([^"\\\n]|(?&es))*"(?&ws)*)+"#)]
String,
#[regex("((?&hp)(?&h)+|(?&bp)(?&b)+|(?&nz)(?&d)*|0(?&o)*)(?&is)?")]
Int,
#[regex(
"((?&d)+(?&e)|(?&d)*[.](?&d)+(?&e)?|(?&d)+[.](?&e)?|(?&hp)((?&h)+(?&p)|(?&h)*[.](?&h)+(?&p)|(?&h)+[.](?&p)))(?&fs)?"
)]
Float,
#[regex("(?&l)(?&a)*")]
Identifier,
#[error]
#[regex(r"(?&ws)+", logos::skip)]
Unknown,
}