oak_cpp/lexer/token_type.rs
1use oak_core::{TokenType, UniversalTokenRole};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5#[repr(u16)]
6/// Token types for the C++ language.
7pub enum CppTokenType {
8 // Trivia tokens
9 /// Whitespace characters (spaces, tabs)
10 Whitespace,
11 /// Newline characters
12 Newline,
13 /// Comments (both single-line and multi-line)
14 Comment,
15
16 // Literals
17 /// String literals (e.g., "hello")
18 StringLiteral,
19 /// Character literals (e.g., 'a')
20 CharacterLiteral,
21 /// Integer literals (e.g., 42, 0xFF)
22 IntegerLiteral,
23 /// Floating-point literals (e.g., 3.14, 2.5e10)
24 FloatLiteral,
25 /// Boolean literals (true, false)
26 BooleanLiteral,
27
28 // Identifiers and keywords
29 /// Identifiers (variable names, function names, etc.)
30 Identifier,
31 /// Keywords (language reserved words)
32 Keyword,
33
34 // Operators
35 /// Plus operator: +
36 Plus,
37 /// Minus operator: -
38 Minus,
39 /// Multiplication operator: *
40 Star,
41 /// Division operator: /
42 Slash,
43 /// Modulo operator: %
44 Percent,
45 /// Assignment operator: =
46 Assign,
47 /// Plus-assignment operator: +=
48 PlusAssign,
49 /// Minus-assignment operator: -=
50 MinusAssign,
51 /// Multiply-assignment operator: *=
52 StarAssign,
53 /// Divide-assignment operator: /=
54 SlashAssign,
55 /// Modulo-assignment operator: %=
56 PercentAssign,
57 /// Equality operator: ==
58 Equal,
59 /// Inequality operator: !=
60 NotEqual,
61 /// Less-than operator: <
62 Less,
63 /// Greater-than operator: >
64 Greater,
65 /// Less-than-or-equal operator: <=
66 LessEqual,
67 /// Greater-than-or-equal operator: >=
68 GreaterEqual,
69 /// Logical AND operator: &&
70 LogicalAnd,
71 /// Logical OR operator: ||
72 LogicalOr,
73 /// Logical NOT operator: !
74 LogicalNot,
75 /// Bitwise AND operator: &
76 BitAnd,
77 /// Bitwise OR operator: |
78 BitOr,
79 /// Bitwise XOR operator: ^
80 BitXor,
81 /// Bitwise NOT operator: ~
82 BitNot,
83 /// Left shift operator: <<
84 LeftShift,
85 /// Right shift operator: >>
86 RightShift,
87 /// AND-assignment operator: &=
88 AndAssign,
89 /// OR-assignment operator: |=
90 OrAssign,
91 /// XOR-assignment operator: ^=
92 XorAssign,
93 /// Left shift-assignment operator: <<=
94 LeftShiftAssign,
95 /// Right shift-assignment operator: >>=
96 RightShiftAssign,
97 /// Increment operator: ++
98 Increment,
99 /// Decrement operator: --
100 Decrement,
101 /// Arrow operator: ->
102 Arrow,
103 /// Scope resolution operator: ::
104 Scope,
105 /// Question mark: ?
106 Question,
107 /// Colon: :
108 Colon,
109 /// Semicolon: ;
110 Semicolon,
111 /// Comma: ,
112 Comma,
113 /// Dot operator: .
114 Dot,
115 /// Pointer-to-member operator: .*
116 DotStar,
117 /// Pointer-to-member arrow operator: ->*
118 ArrowStar,
119
120 // Punctuation
121 /// Left parenthesis: (
122 LeftParen,
123 /// Right parenthesis: )
124 RightParen,
125 /// Left bracket: [
126 LeftBracket,
127 /// Right bracket: ]
128 RightBracket,
129 /// Left brace: {
130 LeftBrace,
131 /// Right brace: }
132 RightBrace,
133
134 // Preprocessor
135 /// Preprocessor hash: #
136 Hash,
137 /// Double hash: ##
138 DoubleHash,
139 /// Preprocessor directive
140 Preprocessor,
141
142 // Special
143 /// End of file
144 EndOfFile,
145 /// Unknown token
146 Unknown,
147 /// Error token
148 Error,
149}
150
151impl TokenType for CppTokenType {
152 type Role = UniversalTokenRole;
153 const END_OF_STREAM: Self = Self::EndOfFile;
154
155 fn role(&self) -> UniversalTokenRole {
156 match self {
157 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
158 Self::Comment => UniversalTokenRole::Comment,
159 Self::StringLiteral | Self::CharacterLiteral | Self::IntegerLiteral | Self::FloatLiteral => UniversalTokenRole::Literal,
160 Self::BooleanLiteral => UniversalTokenRole::Keyword,
161 Self::Identifier => UniversalTokenRole::Name,
162 Self::Keyword => UniversalTokenRole::Keyword,
163 Self::Plus
164 | Self::Minus
165 | Self::Star
166 | Self::Slash
167 | Self::Percent
168 | Self::Assign
169 | Self::PlusAssign
170 | Self::MinusAssign
171 | Self::StarAssign
172 | Self::SlashAssign
173 | Self::PercentAssign
174 | Self::Equal
175 | Self::NotEqual
176 | Self::Less
177 | Self::Greater
178 | Self::LessEqual
179 | Self::GreaterEqual
180 | Self::LogicalAnd
181 | Self::LogicalOr
182 | Self::LogicalNot
183 | Self::BitAnd
184 | Self::BitOr
185 | Self::BitXor
186 | Self::BitNot
187 | Self::LeftShift
188 | Self::RightShift
189 | Self::AndAssign
190 | Self::OrAssign
191 | Self::XorAssign
192 | Self::LeftShiftAssign
193 | Self::RightShiftAssign
194 | Self::Increment
195 | Self::Decrement
196 | Self::Arrow
197 | Self::Scope
198 | Self::Question
199 | Self::Colon
200 | Self::Dot
201 | Self::DotStar
202 | Self::ArrowStar => UniversalTokenRole::Operator,
203 Self::Semicolon | Self::Comma => UniversalTokenRole::Punctuation,
204 Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace => UniversalTokenRole::Punctuation,
205 Self::Hash | Self::DoubleHash | Self::Preprocessor => UniversalTokenRole::Operator,
206 Self::EndOfFile => UniversalTokenRole::Eof,
207 Self::Unknown | Self::Error => UniversalTokenRole::Error,
208 }
209 }
210}