Skip to main content

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}