oak_ada/lexer/token_type.rs
1use oak_core::{TokenType, UniversalTokenRole};
2
3/// Ada token types.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum AdaTokenType {
7 /// Whitespace characters.
8 Whitespace,
9 /// Newline characters.
10 Newline,
11 /// Comments.
12 Comment,
13
14 /// String literals.
15 StringLiteral,
16 /// Character literals.
17 CharacterLiteral,
18 /// Number literals.
19 NumberLiteral,
20 /// Identifiers.
21 Identifier,
22
23 /// `abort` keyword.
24 Abort,
25 /// `abs` keyword.
26 Abs,
27 /// `abstract` keyword.
28 Abstract,
29 /// `accept` keyword.
30 Accept,
31 /// `access` keyword.
32 Access,
33 /// `aliased` keyword.
34 Aliased,
35 /// `all` keyword.
36 All,
37 /// `and` keyword.
38 And,
39 /// `array` keyword.
40 Array,
41 /// `at` keyword.
42 At,
43 /// `begin` keyword.
44 Begin,
45 /// `body` keyword.
46 Body,
47 /// `case` keyword.
48 Case,
49 /// `constant` keyword.
50 Constant,
51 /// `declare` keyword.
52 Declare,
53 /// `delay` keyword.
54 Delay,
55 /// `delta` keyword.
56 Delta,
57 /// `digits` keyword.
58 Digits,
59 /// `do` keyword.
60 Do,
61 /// `else` keyword.
62 Else,
63 /// `elsif` keyword.
64 Elsif,
65 /// `end` keyword.
66 End,
67 /// `entry` keyword.
68 Entry,
69 /// `exception` keyword.
70 Exception,
71 /// `exit` keyword.
72 Exit,
73 /// `for` keyword.
74 For,
75 /// `function` keyword.
76 Function,
77 /// `generic` keyword.
78 Generic,
79 /// `goto` keyword.
80 Goto,
81 /// `if` keyword.
82 If,
83 /// `in` keyword.
84 In,
85 /// `interface` keyword.
86 Interface,
87 /// `is` keyword.
88 Is,
89 /// `limited` keyword.
90 Limited,
91 /// `loop` keyword.
92 Loop,
93 /// `mod` keyword.
94 Mod,
95 /// `new` keyword.
96 New,
97 /// `not` keyword.
98 Not,
99 /// The `null` keyword.
100 Null,
101 /// The `of` keyword.
102 Of,
103 /// The `or` keyword.
104 Or,
105 /// The `others` keyword.
106 Others,
107 /// The `out` keyword.
108 Out,
109 /// The `overriding` keyword.
110 Overriding,
111 /// The `package` keyword.
112 Package,
113 /// The `pragma` keyword.
114 Pragma,
115 /// The `private` keyword.
116 Private,
117 /// The `procedure` keyword.
118 Procedure,
119 /// The `protected` keyword.
120 Protected,
121 /// The `raise` keyword.
122 Raise,
123 /// The `range` keyword.
124 Range,
125 /// The `record` keyword.
126 Record,
127 /// The `rem` keyword.
128 Rem,
129 /// The `renames` keyword.
130 Renames,
131 /// The `requeue` keyword.
132 Requeue,
133 /// The `return` keyword.
134 Return,
135 /// The `reverse` keyword.
136 Reverse,
137 /// The `select` keyword.
138 Select,
139 /// The `separate` keyword.
140 Separate,
141 /// The `some` keyword.
142 Some,
143 /// The `subtype` keyword.
144 Subtype,
145 /// The `synchronized` keyword.
146 Synchronized,
147 /// The `tagged` keyword.
148 Tagged,
149 /// The `task` keyword.
150 Task,
151 /// The `terminate` keyword.
152 Terminate,
153 /// The `then` keyword.
154 Then,
155 /// The `type` keyword.
156 Type,
157 /// The `until` keyword.
158 Until,
159 /// The `use` keyword.
160 Use,
161 /// The `when` keyword.
162 When,
163 /// The `while` keyword.
164 While,
165 /// The `with` keyword.
166 With,
167 /// The `xor` keyword.
168 Xor,
169
170 /// Plus (`+`).
171 Plus,
172 /// Minus (`-`).
173 Minus,
174 /// Star (`*`).
175 Star,
176 /// Slash (`/`).
177 Slash,
178 /// Ampersand (`&`).
179 Ampersand,
180 /// Equal (`=`).
181 Eq,
182 /// Not equal (`/=`).
183 Ne,
184 /// Less than (`<`).
185 Lt,
186 /// Less than or equal (`<=`).
187 Le,
188 /// Greater than (`>`).
189 Gt,
190 /// Greater than or equal (`>=`).
191 Ge,
192 /// Assignment (`:=`).
193 Assign,
194 /// Colon equal (`:=`).
195 ColonEq,
196 /// Arrow (`=>`).
197 Arrow,
198 /// Dot (`.`).
199 Dot,
200 /// DotDot (`..`).
201 DotDot,
202 /// Comma (`,`).
203 Comma,
204 /// Colon (`:`).
205 Colon,
206 /// Semicolon (`;`).
207 Semicolon,
208 /// Bar (`|`).
209 Bar,
210 /// Pipe (`|`).
211 Pipe,
212 /// Apostrophe (`'`).
213 Apostrophe,
214 /// Tick (`'`).
215 Tick,
216 /// Left parenthesis (`(`).
217 LeftParen,
218 /// Right parenthesis (`)`).
219 RightParen,
220 /// Box (`<>`).
221 Box,
222 /// Double star (`**`).
223 DoubleStar,
224 /// Star star (`**`).
225 StarStar,
226 /// Left label delimiter (`<<`).
227 LtLt,
228 /// Right label delimiter (`>>`).
229 GtGt,
230 /// Left bracket (`[`).
231 LeftBracket,
232 /// Right bracket (`]`).
233 RightBracket,
234 /// Left brace (`{`).
235 LeftBrace,
236 /// Right brace (`}`).
237 RightBrace,
238
239 /// End of stream.
240 Eof,
241 /// Error token.
242 Error,
243}
244
245impl AdaTokenType {
246 /// Checks if it is a keyword.
247 pub fn is_keyword(&self) -> bool {
248 matches!(
249 self,
250 Self::Abort
251 | Self::Abs
252 | Self::Abstract
253 | Self::Accept
254 | Self::Access
255 | Self::Aliased
256 | Self::All
257 | Self::And
258 | Self::Array
259 | Self::At
260 | Self::Begin
261 | Self::Body
262 | Self::Case
263 | Self::Constant
264 | Self::Declare
265 | Self::Delay
266 | Self::Delta
267 | Self::Digits
268 | Self::Do
269 | Self::Else
270 | Self::Elsif
271 | Self::End
272 | Self::Entry
273 | Self::Exception
274 | Self::Exit
275 | Self::For
276 | Self::Function
277 | Self::Generic
278 | Self::Goto
279 | Self::If
280 | Self::In
281 | Self::Interface
282 | Self::Is
283 | Self::Limited
284 | Self::Loop
285 | Self::Mod
286 | Self::New
287 | Self::Not
288 | Self::Null
289 | Self::Of
290 | Self::Or
291 | Self::Others
292 | Self::Out
293 | Self::Overriding
294 | Self::Package
295 | Self::Pragma
296 | Self::Private
297 | Self::Procedure
298 | Self::Protected
299 | Self::Raise
300 | Self::Range
301 | Self::Record
302 | Self::Rem
303 | Self::Renames
304 | Self::Requeue
305 | Self::Return
306 | Self::Reverse
307 | Self::Select
308 | Self::Separate
309 | Self::Some
310 | Self::Subtype
311 | Self::Synchronized
312 | Self::Tagged
313 | Self::Task
314 | Self::Terminate
315 | Self::Then
316 | Self::Type
317 | Self::Until
318 | Self::Use
319 | Self::When
320 | Self::While
321 | Self::With
322 | Self::Xor
323 )
324 }
325
326 /// Checks if it is an identifier.
327 pub fn is_identifier(&self) -> bool {
328 matches!(self, Self::Identifier)
329 }
330
331 /// Checks if it is a literal.
332 pub fn is_literal(&self) -> bool {
333 matches!(self, Self::StringLiteral | Self::CharacterLiteral | Self::NumberLiteral)
334 }
335}
336
337impl TokenType for AdaTokenType {
338 type Role = UniversalTokenRole;
339 const END_OF_STREAM: Self = Self::Eof;
340
341 fn is_comment(&self) -> bool {
342 matches!(self, Self::Comment)
343 }
344
345 fn is_whitespace(&self) -> bool {
346 matches!(self, Self::Whitespace | Self::Newline)
347 }
348
349 fn is_error(&self) -> bool {
350 matches!(self, Self::Error)
351 }
352
353 fn role(&self) -> Self::Role {
354 use UniversalTokenRole::*;
355 match self {
356 _ if self.is_keyword() => Keyword,
357 Self::Identifier => Name,
358 _ if self.is_literal() => Literal,
359 Self::Comment => Comment,
360 Self::Whitespace | Self::Newline => Whitespace,
361 Self::Error => Error,
362 Self::Eof => Eof,
363 Self::Plus
364 | Self::Minus
365 | Self::Star
366 | Self::Slash
367 | Self::Ampersand
368 | Self::Eq
369 | Self::Ne
370 | Self::Lt
371 | Self::Le
372 | Self::Gt
373 | Self::Ge
374 | Self::Assign
375 | Self::ColonEq
376 | Self::Arrow
377 | Self::DoubleStar
378 | Self::StarStar
379 | Self::LtLt
380 | Self::GtGt => Operator,
381 Self::Dot
382 | Self::DotDot
383 | Self::Comma
384 | Self::Colon
385 | Self::Semicolon
386 | Self::Bar
387 | Self::Pipe
388 | Self::Apostrophe
389 | Self::Tick
390 | Self::LeftParen
391 | Self::RightParen
392 | Self::Box
393 | Self::LeftBracket
394 | Self::RightBracket
395 | Self::LeftBrace
396 | Self::RightBrace => Punctuation,
397 _ => None,
398 }
399 }
400}