use internship::IStr;
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct Number {
pub integer: u32,
pub decimal: u32,
pub exponent: i64,
pub radix: u8,
}
impl Number {
#[inline]
pub fn new(integer: u32, decimal: u32, exponent: i64, radix: u8) -> Self {
Self {
integer,
decimal,
exponent,
radix,
}
}
}
#[derive(PartialEq, Clone, Debug)]
pub enum Token {
LBrace,
RBrace,
LParen,
RParen,
LBracket,
RBracket,
Semicolon,
Assign,
Lt,
Gt,
Minus,
Tilde,
Exclamation,
Plus,
Multi,
Slash,
Colon,
QuestionMark,
Comma,
Dot,
SingleAnd,
InclusiveOr,
ExclusiveOr,
Mod,
Identifier(IStr),
NumericLiteral(Number),
StringLiteral(String),
FuncName,
SIZEOF,
PtrOp,
IncOp,
DecOp,
LeftOp,
RightOp,
LeOp,
GeOp,
EqOp,
NeOp,
AndOp,
OrOp,
MulAssign,
DivAssign,
ModAssign,
AddAssign,
SubAssign,
LeftAssign,
RightAssign,
AndAssign,
XorAssign,
OrAssign,
TypedefName,
ELLIPSIS,
EnumerationConstant(String),
LineTerminator,
EOF,
TYPEDEF,
EXTERN,
STATIC,
AUTO,
REGISTER,
INLINE,
CONST,
RESTRICT,
VOLATILE,
BOOL,
CHAR,
SHORT,
INT,
LONG,
SIGNED,
UNSIGNED,
FLOAT,
DOUBLE,
VOID,
COMPLEX,
IMAGINARY,
STRUCT,
UNION,
ENUM,
CASE,
DEFAULT,
IF,
ELSE,
SWITCH,
WHILE,
DO,
FOR,
GOTO,
CONTINUE,
BREAK,
RETURN,
ALIGNAS,
ALIGNOF,
ATOMIC,
GENERIC,
NORETURN,
StaticAssert,
ThreadLocal,
}
pub const TOKENS: phf::Map<&'static str, Token> = phf_map! {
"{" => Token::LBrace,
"}" => Token::RBrace,
"(" => Token::LParen,
")" => Token::RParen,
"[" => Token::LBracket,
"]" => Token::RBracket,
";" => Token::Semicolon,
"=" => Token::Assign,
"<" => Token::Lt,
">" => Token::Gt,
"-" => Token::Minus,
"~" => Token::Tilde,
"!" => Token::Exclamation,
"+" => Token::Plus,
"*" => Token::Multi,
":" => Token::Colon,
"?" => Token::QuestionMark,
"," => Token::Comma,
"." => Token::Dot,
"&" => Token::SingleAnd,
"|" => Token::InclusiveOr,
"^" => Token::ExclusiveOr,
"%" => Token::Mod,
"->" => Token::PtrOp,
"++" => Token::IncOp,
"--" => Token::DecOp,
"<<" => Token::LeftOp,
">>" => Token::RightOp,
"<=" => Token::LeOp,
">=" => Token::GeOp,
"==" => Token::EqOp,
"!=" => Token::NeOp,
"&&" => Token::AndOp,
"||" => Token::OrOp,
"*=" => Token::MulAssign,
"%=" => Token::ModAssign,
"+=" => Token::AddAssign,
"-=" => Token::SubAssign,
"<<=" => Token::LeftAssign,
">>=" => Token::RightAssign,
"&=" => Token::AndAssign,
"^=" => Token::XorAssign,
"|=" => Token::OrAssign,
};