oak_cpp/lexer/token_type.rs
1use oak_core::{TokenType, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
5#[repr(u16)]
6pub enum CppTokenType {
7 // Trivia tokens
8 /// Whitespace characters (spaces, tabs)
9 Whitespace,
10 /// Newline characters
11 Newline,
12 /// Comments (both single-line and multi-line)
13 Comment,
14
15 // Literals
16 /// String literals (e.g., "hello")
17 StringLiteral,
18 /// Character literals (e.g., 'a')
19 CharacterLiteral,
20 /// Integer literals (e.g., 42, 0xFF)
21 IntegerLiteral,
22 /// Floating-point literals (e.g., 3.14, 2.5e10)
23 FloatLiteral,
24 /// Boolean literals (true, false)
25 BooleanLiteral,
26
27 // Identifiers and keywords
28 /// Identifiers (variable names, function names, etc.)
29 Identifier,
30 /// Keywords (language reserved words)
31 Keyword,
32
33 // Operators
34 /// Plus operator: +
35 Plus,
36 /// Minus operator: -
37 Minus,
38 /// Multiplication operator: *
39 Star,
40 /// Division operator: /
41 Slash,
42 /// Modulo operator: %
43 Percent,
44 /// Assignment operator: =
45 Assign,
46 /// Plus-assignment operator: +=
47 PlusAssign,
48 /// Minus-assignment operator: -=
49 MinusAssign,
50 /// Multiply-assignment operator: *=
51 StarAssign,
52 /// Divide-assignment operator: /=
53 SlashAssign,
54 /// Modulo-assignment operator: %=
55 PercentAssign,
56 /// Equality operator: ==
57 Equal,
58 /// Inequality operator: !=
59 NotEqual,
60 /// Less-than operator: <
61 Less,
62 /// Greater-than operator: >
63 Greater,
64 /// Less-than-or-equal operator: <=
65 LessEqual,
66 /// Greater-than-or-equal operator: >=
67 GreaterEqual,
68 /// Logical AND operator: &&
69 LogicalAnd,
70 /// Logical OR operator: ||
71 LogicalOr,
72 /// Logical NOT operator: !
73 LogicalNot,
74 /// Bitwise AND operator: &
75 BitAnd,
76 /// Bitwise OR operator: |
77 BitOr,
78 /// Bitwise XOR operator: ^
79 BitXor,
80 /// Bitwise NOT operator: ~
81 BitNot,
82 /// Left shift operator: <<
83 LeftShift,
84 /// Right shift operator: >>
85 RightShift,
86 /// AND-assignment operator: &=
87 AndAssign,
88 /// OR-assignment operator: |=
89 OrAssign,
90 /// XOR-assignment operator: ^=
91 XorAssign,
92 /// Left shift-assignment operator: <<=
93 LeftShiftAssign,
94 /// Right shift-assignment operator: >>=
95 RightShiftAssign,
96 /// Increment operator: ++
97 Increment,
98 /// Decrement operator: --
99 Decrement,
100 /// Arrow operator: ->
101 Arrow,
102 /// Dot operator: .
103 Dot,
104 /// Ternary operator: ?
105 Question,
106 /// Colon operator: :
107 Colon,
108 /// Scope resolution operator: ::
109 Scope,
110
111 // Delimiters
112 /// Left parenthesis: (
113 LeftParen,
114 /// Right parenthesis: )
115 RightParen,
116 /// Left bracket: [
117 LeftBracket,
118 /// Right bracket: ]
119 RightBracket,
120 /// Left brace: {
121 LeftBrace,
122 /// Right brace: }
123 RightBrace,
124 /// Comma: ,
125 Comma,
126 /// Semicolon: ;
127 Semicolon,
128
129 // Preprocessor
130 /// Preprocessor directives (e.g., #include, #define)
131 Preprocessor,
132
133 Text,
134 Error,
135 Eof,
136}
137
138impl TokenType for CppTokenType {
139 const END_OF_STREAM: Self = Self::Eof;
140 type Role = UniversalTokenRole;
141
142 fn is_comment(&self) -> bool {
143 matches!(self, Self::Comment)
144 }
145
146 fn is_whitespace(&self) -> bool {
147 matches!(self, Self::Whitespace | Self::Newline)
148 }
149
150 fn role(&self) -> Self::Role {
151 match self {
152 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
153 Self::Comment => UniversalTokenRole::Comment,
154 Self::Eof => UniversalTokenRole::Eof,
155 Self::Error => UniversalTokenRole::Error,
156 _ => UniversalTokenRole::None,
157 }
158 }
159}