oak_vlang/lexer/token_type.rs
1use oak_core::{Token, TokenType, UniversalTokenRole};
2
3/// Token type for the V language.
4pub type VLangToken = Token<VLangTokenType>;
5
6/// Token types for the V language.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub enum VLangTokenType {
10 // Basic
11 /// An identifier.
12 Identifier,
13 /// Whitespace.
14 Whitespace,
15 /// A newline character.
16 Newline,
17 /// A comment.
18 Comment,
19 /// A lexical error.
20 Error,
21 /// End of input.
22 Eof,
23
24 // Literals
25 /// A string literal.
26 StringLiteral,
27 /// A character literal.
28 CharLiteral,
29 /// An integer literal.
30 IntegerLiteral,
31 /// A floating-point literal.
32 FloatLiteral,
33 /// A boolean literal.
34 BoolLiteral,
35
36 // Keywords
37 /// The `module` keyword.
38 ModuleKw,
39 /// The `import` keyword.
40 ImportKw,
41 /// The `pub` keyword.
42 PubKw,
43 /// The `fn` keyword.
44 FnKw,
45 /// The `struct` keyword.
46 StructKw,
47 /// The `interface` keyword.
48 InterfaceKw,
49 /// The `enum` keyword.
50 EnumKw,
51 /// The `type` keyword.
52 TypeKw,
53 /// The `const` keyword.
54 ConstKw,
55 /// The `mut` keyword.
56 MutKw,
57 /// The `shared` keyword.
58 SharedKw,
59 /// The `volatile` keyword.
60 VolatileKw,
61 /// The `unsafe` keyword.
62 UnsafeKw,
63 /// The `if` keyword.
64 IfKw,
65 /// The `else` keyword.
66 ElseKw,
67 /// The `for` keyword.
68 ForKw,
69 /// The `in` keyword.
70 InKw,
71 /// The `match` keyword.
72 MatchKw,
73 /// The `or` keyword.
74 OrKw,
75 /// The `return` keyword.
76 ReturnKw,
77 /// The `break` keyword.
78 BreakKw,
79 /// The `continue` keyword.
80 ContinueKw,
81 /// The `goto` keyword.
82 GotoKw,
83 /// The `defer` keyword.
84 DeferKw,
85 /// The `go` keyword.
86 GoKw,
87 /// The `select` keyword.
88 SelectKw,
89 /// The `lock` keyword.
90 LockKw,
91 /// The `rlock` keyword.
92 RlockKw,
93 /// The `as` keyword.
94 AsKw,
95 /// The `is` keyword.
96 IsKw,
97 /// The `sizeof` keyword.
98 SizeofKw,
99 /// The `typeof` keyword.
100 TypeofKw,
101 /// The `offsetof` keyword.
102 OffsetofKw,
103 /// The `assert` keyword.
104 AssertKw,
105 /// The `panic` keyword.
106 PanicKw,
107 /// The `eprintln` keyword.
108 EprintlnKw,
109 /// The `println` keyword.
110 PrintlnKw,
111 /// The `print` keyword.
112 PrintKw,
113 /// The `eprint` keyword.
114 EprintKw,
115 /// The `bool` keyword.
116 BoolKw,
117 /// The `i8` keyword.
118 I8Kw,
119 /// The `i16` keyword.
120 I16Kw,
121 /// The `i32` keyword.
122 I32Kw,
123 /// The `i64` keyword.
124 I64Kw,
125 /// The `u8` keyword.
126 U8Kw,
127 /// The `u16` keyword.
128 U16Kw,
129 /// The `u32` keyword.
130 U32Kw,
131 /// The `u64` keyword.
132 U64Kw,
133 /// The `int` keyword.
134 IntKw,
135 /// The `uint` keyword.
136 UintKw,
137 /// The `f32` keyword.
138 F32Kw,
139 /// The `f64` keyword.
140 F64Kw,
141 /// The `string` keyword.
142 StringKw,
143 /// The `rune` keyword.
144 RuneKw,
145 /// The `byte` keyword.
146 ByteKw,
147 /// The `voidptr` keyword.
148 VoidptrKw,
149 /// The `char` keyword.
150 CharKw,
151
152 // Operators and Punctuation
153 /// The `+` operator.
154 Plus,
155 /// The `-` operator.
156 Minus,
157 /// The `*` operator.
158 Star,
159 /// The `/` operator.
160 Slash,
161 /// The `%` operator.
162 Percent,
163 /// The `+=` operator.
164 PlusEq,
165 /// The `-=` operator.
166 MinusEq,
167 /// The `*=` operator.
168 StarEq,
169 /// The `/=` operator.
170 SlashEq,
171 /// The `%=` operator.
172 PercentEq,
173 /// The `++` operator.
174 PlusPlus,
175 /// The `--` operator.
176 MinusMinus,
177 /// The `&` operator.
178 Ampersand,
179 /// The `|` operator.
180 Pipe,
181 /// The `^` operator.
182 Caret,
183 /// The `&=` operator.
184 AmpersandEq,
185 /// The `|=` operator.
186 PipeEq,
187 /// The `^=` operator.
188 CaretEq,
189 /// The `&&` operator.
190 AndAnd,
191 /// The `||` operator.
192 OrOr,
193 /// The `=` operator.
194 Eq,
195 /// The `==` operator.
196 EqEq,
197 /// The `!=` operator.
198 Ne,
199 /// The `!` operator.
200 Bang,
201 /// The `<` operator.
202 Lt,
203 /// The `<=` operator.
204 Le,
205 /// The `>` operator.
206 Gt,
207 /// The `>=` operator.
208 Ge,
209 /// The `<<` operator.
210 LeftShift,
211 /// The `>>` operator.
212 RightShift,
213 /// The `<<=` operator.
214 LeftShiftEq,
215 /// The `>>=` operator.
216 RightShiftEq,
217 /// The `->` operator.
218 Arrow,
219 /// The `=>` operator.
220 FatArrow,
221 /// The `<` operator (alternative).
222 LessThan, // Used in lexer/mod.rs:473
223 /// The `>` operator (alternative).
224 GreaterThan, // Used in lexer/mod.rs:493
225 /// The `..` operator.
226 DotDot,
227 /// The `...` operator.
228 DotDotDot,
229 /// The `,` punctuation.
230 Comma,
231 /// The `;` punctuation.
232 Semicolon,
233 /// The `.` punctuation.
234 Dot,
235 /// The `:` punctuation.
236 Colon,
237 /// The `(` punctuation.
238 LeftParen,
239 /// The `)` punctuation.
240 RightParen,
241 /// The `[` punctuation.
242 LeftBracket,
243 /// The `]` punctuation.
244 RightBracket,
245 /// The `{` punctuation.
246 LeftBrace,
247 /// The `}` punctuation.
248 RightBrace,
249 /// The `?` punctuation.
250 Question,
251 /// The `~` punctuation.
252 Tilde,
253}
254
255impl TokenType for VLangTokenType {
256 type Role = UniversalTokenRole;
257 const END_OF_STREAM: Self = Self::Eof;
258
259 fn is_ignored(&self) -> bool {
260 matches!(self, Self::Whitespace | Self::Comment)
261 }
262
263 fn role(&self) -> Self::Role {
264 match self {
265 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
266 Self::Comment => UniversalTokenRole::Comment,
267 Self::Eof => UniversalTokenRole::Eof,
268 Self::Error => UniversalTokenRole::Error,
269 _ => UniversalTokenRole::None,
270 }
271 }
272}