lexer/
token.rs

1//! Token model
2
3use std::fmt;
4
5use span::Span;
6
7/// Models all the types of token
8#[derive(Clone, Copy, Debug, PartialEq)]
9pub enum TokenKind {
10    /// "("
11    LeftParen,
12
13    /// ")"
14    RightParen,
15
16    /// "{"
17    LeftBrace,
18
19    /// "}"
20    RightBrace,
21
22    /// "["
23    LeftBracket,
24
25    /// "]"
26    RightBracket,
27
28    /// ","
29    Comma,
30
31    /// "."
32    Dot,
33
34    /// "-"
35    Minus,
36
37    /// "+"
38    Plus,
39
40    /// ";"
41    Semicolon,
42
43    /// ":"
44    Colon,
45
46    /// "::"
47    DoubleColon,
48
49    /// "/"
50    Slash,
51
52    /// "*"
53    Star,
54
55    /// "?"
56    Question,
57
58    /// "!"
59    Bang,
60
61    /// "!="
62    BangEqual,
63
64    /// "="
65    Equal,
66
67    /// "=="
68    EqualEqual,
69
70    /// "\>"
71    Greater,
72
73    /// "\>="
74    GreaterEqual,
75
76    /// "<"
77    Less,
78
79    /// "->"
80    Arrow,
81
82    /// "<="
83    LessEqual,
84
85    /// [a-zA-Z_]\[a-zA-Z_0-9\]*
86    Identifier,
87
88    /// "(.|\\\\.)*?"
89    String,
90
91    /// [0-9]+
92    IntLiteral,
93
94    /// [0-9]+\.[0-9]+
95    FloatLiteral,
96
97    /// '\\?.'
98    CharLiteral,
99
100    /* ==== Primitive Types ==== */
101    /// "i8"
102    I8,
103    /// "i16"
104    I16,
105    /// "i32"
106    I32,
107    /// "i64"
108    I64,
109    /// "u8"
110    U8,
111    /// "u16"
112    U16,
113    /// "u32"
114    U32,
115    /// "u64"
116    U64,
117    /// "f32"
118    F32,
119    /// "f64"
120    F64,
121    /// "char"
122    Char,
123    /// "bool"
124    Bool,
125    /* ========================= */
126
127    /// "struct"
128    Struct,
129
130    /// "else"
131    Else,
132
133    /// "false"
134    False,
135
136    /// "fn"
137    Fn,
138
139    /// "for"
140    For,
141
142    /// "if"
143    If,
144
145    /// "return"
146    Return,
147
148    /// "true"
149    True,
150
151    /// "let"
152    Let,
153
154    /// "const"
155    Const,
156
157    /// "while"
158    While,
159
160    /// "break"
161    Break,
162
163    /// "continue"
164    Continue,
165
166    /// "use"
167    Use,
168
169    /// "as"
170    As,
171
172    /// "mod"
173    Mod,
174
175    /// "&"
176    Ampersand,
177
178    /// "|"
179    VerticalPipe,
180
181    /// "&&"
182    And,
183
184    /// "||"
185    Or,
186
187    /// '%'
188    Modulo,
189
190    /// "extern"
191    Extern,
192
193    /// "..."
194    ThreeDot,
195}
196
197/// A token consist on a discriminator [`TokenKind`] and a [Span]
198#[derive(Debug, Clone)]
199pub struct Token {
200    pub kind: TokenKind,
201    pub span: Span,
202}
203
204impl fmt::Display for TokenKind {
205    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{self:?}") }
206}