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
5pub type LuaToken = Token<LuaTokenType>;
6
7impl TokenType for LuaTokenType {
8    type Role = UniversalTokenRole;
9    const END_OF_STREAM: Self = Self::EndOfStream;
10
11    fn is_ignored(&self) -> bool {
12        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
13    }
14
15    fn role(&self) -> Self::Role {
16        match self {
17            Self::And
18            | Self::Break
19            | Self::Do
20            | Self::Else
21            | Self::Elseif
22            | Self::End
23            | Self::False
24            | Self::For
25            | Self::Function
26            | Self::Goto
27            | Self::If
28            | Self::In
29            | Self::Local
30            | Self::Nil
31            | Self::Not
32            | Self::Or
33            | Self::Repeat
34            | Self::Return
35            | Self::Then
36            | Self::True
37            | Self::Until
38            | Self::While => UniversalTokenRole::Keyword,
39
40            Self::Identifier => UniversalTokenRole::Name,
41            Self::Number => UniversalTokenRole::Literal,
42            Self::String => UniversalTokenRole::Literal,
43
44            Self::Plus
45            | Self::Minus
46            | Self::Star
47            | Self::Slash
48            | Self::Percent
49            | Self::Caret
50            | Self::Hash
51            | Self::Ampersand
52            | Self::Tilde
53            | Self::Pipe
54            | Self::LtLt
55            | Self::GtGt
56            | Self::SlashSlash
57            | Self::EqEq
58            | Self::TildeEq
59            | Self::LtEq
60            | Self::GtEq
61            | Self::Lt
62            | Self::Gt
63            | Self::Eq
64            | Self::DotDot
65            | Self::DotDotDot => UniversalTokenRole::Operator,
66
67            Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::ColonColon | Self::Semicolon | Self::Colon | Self::Comma | Self::Dot => UniversalTokenRole::Punctuation,
68
69            Self::Comment => UniversalTokenRole::Comment,
70            _ => UniversalTokenRole::None,
71        }
72    }
73}
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
76#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
77#[repr(u16)]
78pub enum LuaTokenType {
79    Root,
80    // 关键字
81    And,
82    Break,
83    Do,
84    Else,
85    Elseif,
86    End,
87    False,
88    For,
89    Function,
90    Goto,
91    If,
92    In,
93    Local,
94    Nil,
95    Not,
96    Or,
97    Repeat,
98    Return,
99    Then,
100    True,
101    Until,
102    While,
103
104    // 标识符和字面量
105    Identifier,
106    Number,
107    String,
108
109    // 操作符
110    Plus,       // +
111    Minus,      // -
112    Star,       // *
113    Slash,      // /
114    Percent,    // %
115    Caret,      // ^
116    Hash,       // #
117    Ampersand,  // &
118    Tilde,      // ~
119    Pipe,       // |
120    LtLt,       // <<
121    GtGt,       // >>
122    SlashSlash, // //
123    EqEq,       // ==
124    TildeEq,    // ~=
125    LtEq,       // <=
126    GtEq,       // >=
127    Lt,         // <
128    Gt,         // >
129    Eq,         // =
130
131    // 分隔符
132    LeftParen,    // (
133    RightParen,   // )
134    LeftBrace,    // {
135    RightBrace,   // }
136    LeftBracket,  // [
137    RightBracket, // ]
138    ColonColon,   // ::
139    Semicolon,    // ;
140    Colon,        // :
141    Comma,        // ,
142    Dot,          // .
143    DotDot,       // ..
144    DotDotDot,    // ...
145
146    // 空白和注释
147    Whitespace,
148    Newline,
149    Comment,
150
151    // 特殊标记
152    EndOfStream,
153    Error,
154}