oak_lua/lexer/token_type.rs
1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// Token type for Lua.
6pub type LuaToken = Token<LuaTokenType>;
7
8impl TokenType for LuaTokenType {
9 type Role = UniversalTokenRole;
10 const END_OF_STREAM: Self = Self::EndOfStream;
11
12 fn is_ignored(&self) -> bool {
13 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
14 }
15
16 fn role(&self) -> Self::Role {
17 match self {
18 Self::And
19 | Self::Break
20 | Self::Do
21 | Self::Else
22 | Self::Elseif
23 | Self::End
24 | Self::False
25 | Self::For
26 | Self::Function
27 | Self::Goto
28 | Self::If
29 | Self::In
30 | Self::Local
31 | Self::Nil
32 | Self::Not
33 | Self::Or
34 | Self::Repeat
35 | Self::Return
36 | Self::Then
37 | Self::True
38 | Self::Until
39 | Self::While => UniversalTokenRole::Keyword,
40
41 Self::Identifier => UniversalTokenRole::Name,
42 Self::Number => UniversalTokenRole::Literal,
43 Self::String => UniversalTokenRole::Literal,
44
45 Self::Plus
46 | Self::Minus
47 | Self::Star
48 | Self::Slash
49 | Self::Percent
50 | Self::Caret
51 | Self::Hash
52 | Self::Ampersand
53 | Self::Tilde
54 | Self::Pipe
55 | Self::LtLt
56 | Self::GtGt
57 | Self::SlashSlash
58 | Self::EqEq
59 | Self::TildeEq
60 | Self::LtEq
61 | Self::GtEq
62 | Self::Lt
63 | Self::Gt
64 | Self::Eq
65 | Self::DotDot
66 | Self::DotDotDot => UniversalTokenRole::Operator,
67
68 Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::ColonColon | Self::Semicolon | Self::Colon | Self::Comma | Self::Dot => UniversalTokenRole::Punctuation,
69
70 Self::Comment => UniversalTokenRole::Comment,
71 _ => UniversalTokenRole::None,
72 }
73 }
74}
75
76/// Token types for Lua.
77#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
78#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
79#[repr(u16)]
80pub enum LuaTokenType {
81 /// Root node.
82 Root,
83 // Keywords
84 /// The `and` keyword.
85 And,
86 /// The `break` keyword.
87 Break,
88 /// The `do` keyword.
89 Do,
90 /// The `else` keyword.
91 Else,
92 /// The `elseif` keyword.
93 Elseif,
94 /// The `end` keyword.
95 End,
96 /// The `false` keyword.
97 False,
98 /// The `for` keyword.
99 For,
100 /// The `function` keyword.
101 Function,
102 /// The `goto` keyword.
103 Goto,
104 /// The `if` keyword.
105 If,
106 /// The `in` keyword.
107 In,
108 /// The `local` keyword.
109 Local,
110 /// The `nil` keyword.
111 Nil,
112 /// The `not` keyword.
113 Not,
114 /// The `or` keyword.
115 Or,
116 /// The `repeat` keyword.
117 Repeat,
118 /// The `return` keyword.
119 Return,
120 /// The `then` keyword.
121 Then,
122 /// The `true` keyword.
123 True,
124 /// The `until` keyword.
125 Until,
126 /// The `while` keyword.
127 While,
128
129 // Identifiers and literals
130 /// An identifier.
131 Identifier,
132 /// A numeric literal.
133 Number,
134 /// A string literal.
135 String,
136
137 // Operators
138 /// The `+` operator.
139 Plus,
140 /// The `-` operator.
141 Minus,
142 /// The `*` operator.
143 Star,
144 /// The `/` operator.
145 Slash,
146 /// The `%` operator.
147 Percent,
148 /// The `^` operator.
149 Caret,
150 /// The `#` operator.
151 Hash,
152 /// The `&` operator.
153 Ampersand,
154 /// The `~` operator.
155 Tilde,
156 /// The `|` operator.
157 Pipe,
158 /// The `<<` operator.
159 LtLt,
160 /// The `>>` operator.
161 GtGt,
162 /// The `//` operator.
163 SlashSlash,
164 /// The `==` operator.
165 EqEq,
166 /// The `~=` operator.
167 TildeEq,
168 /// The `<=` operator.
169 LtEq,
170 /// The `>=` operator.
171 GtEq,
172 /// The `<` operator.
173 Lt,
174 /// The `>` operator.
175 Gt,
176 /// The `=` operator.
177 Eq,
178
179 // Delimiters
180 /// The `(` punctuation.
181 LeftParen,
182 /// The `)` punctuation.
183 RightParen,
184 /// The `{` punctuation.
185 LeftBrace,
186 /// The `}` punctuation.
187 RightBrace,
188 /// The `[` punctuation.
189 LeftBracket,
190 /// The `]` punctuation.
191 RightBracket,
192 /// The `::` punctuation.
193 ColonColon,
194 /// The `;` punctuation.
195 Semicolon,
196 /// The `:` punctuation.
197 Colon,
198 /// The `,` punctuation.
199 Comma,
200 /// The `.` punctuation.
201 Dot,
202 /// The `..` punctuation.
203 DotDot,
204 /// The `...` punctuation.
205 DotDotDot,
206
207 // Whitespace and comments
208 /// Whitespace.
209 Whitespace,
210 /// Newline.
211 Newline,
212 /// A comment.
213 Comment,
214
215 // Special markers
216 /// End of stream marker.
217 EndOfStream,
218 /// Error marker.
219 Error,
220}