Skip to main content

oak_valkyrie/lexer/
token_type.rs

1use crate::lexer::ValkyrieKeywords;
2use oak_core::{Token, TokenType, UniversalTokenRole};
3
4/// Alias for `Token<ValkyrieTokenType>`.
5pub type ValkyrieToken = Token<ValkyrieTokenType>;
6/// Alias for the syntax kind type.
7pub type ValkyrieSyntaxKind = ValkyrieTokenType;
8
9/// Token types for the Valkyrie language.
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12pub enum ValkyrieTokenType {
13    /// End of file token.
14    Eof,
15    /// Whitespace token.
16    Whitespace,
17    /// Newline token.
18    Newline,
19    /// Error token.
20    Error,
21
22    // Literals
23    /// Integer literal token.
24    IntegerLiteral,
25    /// Float literal token.
26    FloatLiteral,
27    /// Boolean literal token.
28    BoolLiteral,
29    /// String literal token.
30    StringLiteral,
31    /// String prefix token (e.g., `s`, `f`, `r`, `sql` in `s"..."`).
32    StringPrefix,
33    /// Character literal token.
34    CharLiteral,
35    /// Identifier token.
36    Identifier,
37    /// Label token.
38    Label,
39
40    // Comments
41    /// Line comment token.
42    LineComment,
43    /// Block comment token.
44    BlockComment,
45
46    // Keywords
47    /// Keyword token.
48    Keyword(ValkyrieKeywords),
49
50    // Operators & Punctuation
51    /// Ampersand operator `&`.
52    Ampersand,
53    /// Logical and operator `&&`.
54    AndAnd,
55    /// Arrow operator `->`.
56    Arrow,
57    /// At symbol `@`.
58    At,
59    /// Bang operator `!`.
60    Bang,
61    /// Caret operator `^`.
62    Caret,
63    /// Colon operator `:`.
64    Colon,
65    /// Path separator `::`.
66    ColonColon,
67    /// Assignment operator `:=`.
68    ColonEq,
69    /// Comma separator `,`.
70    Comma,
71    /// Dollar symbol `$`.
72    Dollar,
73    /// Dot operator `.`.
74    Dot,
75    /// Range operator `..`.
76    DotDot,
77    /// Assignment operator `=`.
78    Eq,
79    /// Equality operator `==`.
80    EqEq,
81    /// Greater than or equal operator `>=`.
82    GreaterEq,
83    /// Greater than operator `>`.
84    GreaterThan,
85    /// Left brace `{`.
86    LeftBrace,
87    /// Left bracket `[`.
88    LeftBracket,
89    /// Left parenthesis `(`.
90    LeftParen,
91    /// Left shift operator `<<`.
92    LeftShift,
93    /// Less than or equal operator `<=`.
94    LessEq,
95    /// Less than operator `<`.
96    LessThan,
97    /// Left mathematical angle bracket `⟨` (U+27E8).
98    LeftAngle,
99    /// Right mathematical angle bracket `⟩` (U+27E9).
100    RightAngle,
101    /// 左基数索引括号 `⁅` (U+2045)。
102    LeftOffset,
103    /// 右基数索引括号 `⁆` (U+2046)。
104    RightOffset,
105    /// Minus operator `-`.
106    Minus,
107    /// Not equal operator `!=`.
108    NotEq,
109    /// Logical or operator `||`.
110    OrOr,
111    /// Percent operator `%`.
112    Percent,
113    /// Pipe operator `|`.
114    Pipe,
115    /// Plus operator `+`.
116    Plus,
117    /// Question operator `?`.
118    Question,
119    /// Right brace `}`.
120    RightBrace,
121    /// Right bracket `]`.
122    RightBracket,
123    /// Right parenthesis `)`.
124    RightParen,
125    /// Right shift operator `>>`.
126    RightShift,
127    /// Semicolon separator `;`.
128    Semicolon,
129    /// Slash operator `/`.
130    Slash,
131    /// Star operator `*`.
132    Star,
133    /// Tilde operator `~`.
134    Tilde,
135    /// Underscore token `_`.
136    Underscore,
137}
138
139impl TokenType for ValkyrieTokenType {
140    type Role = UniversalTokenRole;
141    const END_OF_STREAM: Self = Self::Eof;
142
143    fn is_ignored(&self) -> bool {
144        matches!(self, Self::Whitespace | Self::Newline | Self::LineComment | Self::BlockComment)
145    }
146
147    fn role(&self) -> Self::Role {
148        match self {
149            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
150            Self::LineComment | Self::BlockComment => UniversalTokenRole::Comment,
151            Self::Eof => UniversalTokenRole::Eof,
152            Self::Error => UniversalTokenRole::Error,
153            Self::Keyword(_) => UniversalTokenRole::Keyword,
154            Self::Identifier | Self::StringPrefix => UniversalTokenRole::Name,
155            Self::StringLiteral | Self::CharLiteral => UniversalTokenRole::Literal,
156            Self::IntegerLiteral | Self::FloatLiteral | Self::BoolLiteral => UniversalTokenRole::Literal,
157            _ => UniversalTokenRole::None,
158        }
159    }
160}