Skip to main content

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}