use oak_core::{TokenType, UniversalTokenRole};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(u16)]
pub enum CTokenType {
LeftParen,
RightParen,
LeftBracket,
RightBracket,
LeftBrace,
RightBrace,
Comma,
Semicolon,
Colon,
Dot,
Question,
Plus,
Minus,
Star,
Slash,
Percent,
Assign,
PlusAssign,
MinusAssign,
StarAssign,
SlashAssign,
PercentAssign,
Equal,
NotEqual,
Less,
Greater,
LessEqual,
GreaterEqual,
LogicalAnd,
LogicalOr,
LogicalNot,
BitAnd,
BitOr,
BitXor,
BitNot,
LeftShift,
RightShift,
AndAssign,
OrAssign,
XorAssign,
LeftShiftAssign,
RightShiftAssign,
Increment,
Decrement,
Arrow,
Auto,
Break,
Case,
Char,
Const,
Continue,
Default,
Do,
Double,
Else,
Enum,
Extern,
Float,
For,
Goto,
If,
Inline,
Int,
Long,
Register,
Restrict,
Return,
Short,
Signed,
Sizeof,
Static,
Struct,
Switch,
Typedef,
Union,
Unsigned,
Void,
Volatile,
While,
Alignas,
Alignof,
Atomic,
Bool,
Complex,
Generic,
Imaginary,
Noreturn,
StaticAssert,
ThreadLocal,
Identifier,
StringLiteral,
CharConstant,
IntConstant,
FloatConstant,
Whitespace,
LineComment,
BlockComment,
Preprocessor,
Text,
#[default]
Error,
Eof,
}
impl CTokenType {
pub fn is_keyword(&self) -> bool {
matches!(
self,
Self::Auto
| Self::Register
| Self::Static
| Self::Extern
| Self::Typedef
| Self::Void
| Self::Char
| Self::Short
| Self::Int
| Self::Long
| Self::Float
| Self::Double
| Self::Signed
| Self::Unsigned
| Self::Struct
| Self::Union
| Self::Enum
| Self::Const
| Self::Volatile
| Self::Restrict
| Self::If
| Self::Else
| Self::Switch
| Self::Case
| Self::Default
| Self::For
| Self::While
| Self::Do
| Self::Break
| Self::Continue
| Self::Goto
| Self::Return
| Self::Sizeof
| Self::Inline
| Self::Bool
| Self::Complex
| Self::Imaginary
| Self::Alignas
| Self::Alignof
| Self::Atomic
| Self::StaticAssert
| Self::ThreadLocal
| Self::Generic
| Self::Noreturn
)
}
}
impl TokenType for CTokenType {
const END_OF_STREAM: Self = Self::Eof;
type Role = UniversalTokenRole;
fn is_ignored(&self) -> bool {
matches!(self, Self::Whitespace | Self::LineComment | Self::BlockComment)
}
fn is_comment(&self) -> bool {
matches!(self, Self::LineComment | Self::BlockComment)
}
fn is_whitespace(&self) -> bool {
matches!(self, Self::Whitespace)
}
fn role(&self) -> Self::Role {
use UniversalTokenRole::*;
match self {
_ if self.is_keyword() => Keyword,
Self::Identifier => Name,
Self::IntConstant | Self::FloatConstant | Self::CharConstant | Self::StringLiteral => Literal,
Self::Preprocessor => Keyword,
Self::Text => None,
Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace | Self::Comma | Self::Semicolon | Self::Colon | Self::Dot | Self::Question => Punctuation,
Self::Plus
| Self::Minus
| Self::Star
| Self::Slash
| Self::Percent
| Self::Assign
| Self::PlusAssign
| Self::MinusAssign
| Self::StarAssign
| Self::SlashAssign
| Self::PercentAssign
| Self::Equal
| Self::NotEqual
| Self::Less
| Self::Greater
| Self::LessEqual
| Self::GreaterEqual
| Self::LogicalAnd
| Self::LogicalOr
| Self::LogicalNot
| Self::BitAnd
| Self::BitOr
| Self::BitXor
| Self::BitNot
| Self::LeftShift
| Self::RightShift
| Self::AndAssign
| Self::OrAssign
| Self::XorAssign
| Self::LeftShiftAssign
| Self::RightShiftAssign
| Self::Increment
| Self::Decrement
| Self::Arrow => Operator,
Self::LineComment | Self::BlockComment => Comment,
Self::Whitespace => Whitespace,
Self::Error => Error,
Self::Eof => Eof,
_ => None,
}
}
}