1use std::fmt;
4
5use crate::utils::Location;
6
7use super::lexer::LexerError;
8
9#[derive(Debug, Clone, PartialEq)]
11pub enum TokenKind {
12 If,
15 Else,
17 Loop,
19 While,
21 For,
23 In,
25 Break,
27 Continue,
29 Return,
31 Throw,
33 Global,
35 Import,
37 As,
39 Is,
41 Not,
43 And,
45 Or,
47 Try,
49 Fn,
51 Do,
53 Null,
55 True,
57 False,
59
60 DoubleColon,
63 Eq,
65 NotEq,
67 LtEq,
69 GtEq,
71 AddAssign,
73 SubAssign,
75 MulAssign,
77 DivAssign,
79 ModAssign,
81
82 Comma,
85 Dot,
87 OpenParen,
89 CloseParen,
91 OpenBrace,
93 CloseBrace,
95 OpenBracket,
97 CloseBracket,
99 Pound,
101 Question,
103 Colon,
105 Assign,
107 Lt,
109 Gt,
111 VBar,
113 Add,
115 Sub,
117 Mul,
119 Div,
121 Mod,
123
124 EOL,
127 LineComment,
129 BlockComment,
134 Whitespace,
136 Ident(String),
138 Literal(LiteralKind),
140 Unknown(char),
142}
143
144impl fmt::Display for TokenKind {
145 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
146 match self {
147 Self::If => write!(f, "If (if)"),
148 Self::Else => write!(f, "Else (else)"),
149 Self::Loop => write!(f, "Loop (loop)"),
150 Self::While => write!(f, "While (while)"),
151 Self::For => write!(f, "For (for)"),
152 Self::In => write!(f, "In (in)"),
153 Self::Break => write!(f, "Break (break)"),
154 Self::Continue => write!(f, "Continue (continue)"),
155 Self::Return => write!(f, "Return (return)"),
156 Self::Throw => write!(f, "Throw (throw)"),
157 Self::Global => write!(f, "Global (global)"),
158 Self::Import => write!(f, "Import (import)"),
159 Self::As => write!(f, "As (as)"),
160 Self::Is => write!(f, "Is (is)"),
161 Self::Not => write!(f, "Not (not)"),
162 Self::And => write!(f, "And (and)"),
163 Self::Or => write!(f, "Or (or)"),
164 Self::Try => write!(f, "Try (try)"),
165 Self::Fn => write!(f, "Fn (fn)"),
166 Self::Do => write!(f, "Do (do)"),
167 Self::Null => write!(f, "Null (null)"),
168 Self::True => write!(f, "True (true)"),
169 Self::False => write!(f, "False (false)"),
170 Self::DoubleColon => write!(f, "DoubleColon (::)"),
171 Self::Eq => write!(f, "Eq (==)"),
172 Self::NotEq => write!(f, "NotEq (!=)"),
173 Self::LtEq => write!(f, "LtEq (<=)"),
174 Self::GtEq => write!(f, "GtEq (>=)"),
175 Self::AddAssign => write!(f, "AddAssign (+=)"),
176 Self::SubAssign => write!(f, "SubAssign (-=)"),
177 Self::MulAssign => write!(f, "MulAssign (*=)"),
178 Self::DivAssign => write!(f, "DivAssign (/=)"),
179 Self::ModAssign => write!(f, "ModAssign (%=)"),
180 Self::Comma => write!(f, "Comma (,)"),
181 Self::Dot => write!(f, "Dot (.)"),
182 Self::OpenParen => write!(f, "OpenParen (())"),
183 Self::CloseParen => write!(f, "CloseParen ())"),
184 Self::OpenBrace => write!(f, "OpenBrace ({{)"),
185 Self::CloseBrace => write!(f, "CloseBrace (}})"),
186 Self::OpenBracket => write!(f, "OpenBracket ([)"),
187 Self::CloseBracket => write!(f, "CloseBracket (])"),
188 Self::Pound => write!(f, "Pound (#)"),
189 Self::Question => write!(f, "Question (?)"),
190 Self::Colon => write!(f, "Colon (:)"),
191 Self::Assign => write!(f, "Assign (=)"),
192 Self::Lt => write!(f, "Lt (<)"),
193 Self::Gt => write!(f, "Gt (>)"),
194 Self::VBar => write!(f, "VBar (|)"),
195 Self::Add => write!(f, "Add (+)"),
196 Self::Sub => write!(f, "Sub (-)"),
197 Self::Mul => write!(f, "Mul (*)"),
198 Self::Div => write!(f, "Div (/)"),
199 Self::Mod => write!(f, "Mod (%)"),
200 Self::EOL => write!(f, "EOL (\\n)"),
201 Self::LineComment => write!(f, "LineComment (// ...)"),
202 Self::BlockComment => write!(f, "BlockComment (/* ... */)"),
203 Self::Whitespace => write!(f, "Whitespace ( )"),
204 Self::Ident(v) => write!(f, "Ident ({})", v),
205 Self::Literal(v) => write!(f, "Literal ({})", v),
206 Self::Unknown(v) => write!(f, "Unknown({})", v),
207 }
208 }
209}
210
211#[derive(Debug, Clone, PartialEq)]
213pub enum LiteralKind {
214 Int(Result<i64, LexerError>),
216 Float(Result<f64, LexerError>),
218 Str(Result<String, LexerError>),
220}
221
222impl fmt::Display for LiteralKind {
223 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
224 match self {
225 LiteralKind::Int(v) => match v {
226 Ok(v) => write!(f, "{}", v),
227 Err(v) => write!(f, "{}", v),
228 },
229 LiteralKind::Float(v) => match v {
230 Ok(v) => write!(f, "{}", v),
231 Err(v) => write!(f, "{}", v),
232 },
233 LiteralKind::Str(v) => match v {
234 Ok(v) => write!(f, "{}", v),
235 Err(v) => write!(f, "{}", v),
236 },
237 }
238 }
239}
240
241#[derive(Debug, Clone, PartialEq)]
243pub struct Token {
244 pub kind: TokenKind,
246 pub start: Location,
248 pub end: Location,
250}
251
252impl Token {
253 pub fn new(kind: TokenKind, start: Location, end: Location) -> Self {
255 Token { kind, start, end }
256 }
257
258 pub fn dummy() -> Self {
260 Token {
261 kind: TokenKind::Unknown(' '),
262 start: Location {
263 lineno: 1,
264 column: 1,
265 offset: 0,
266 },
267 end: Location {
268 lineno: 1,
269 column: 1,
270 offset: 0,
271 },
272 }
273 }
274}
275
276impl fmt::Display for Token {
277 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
278 write!(
279 f,
280 "Token {:20} start: {}, end: {})",
281 format!("{}", self.kind),
282 self.start,
283 self.end
284 )
285 }
286}
287
288#[derive(Debug, Clone, PartialEq)]
290pub enum TokenType {
291 Token(TokenKind),
293 Ident,
295 Literal,
297}
298
299impl fmt::Display for TokenType {
300 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
301 match self {
302 Self::Token(t) => write!(f, "{}", t),
303 Self::Ident => write!(f, "Ident"),
304 Self::Literal => write!(f, "Literal"),
305 }
306 }
307}