Skip to main content

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}