1#[derive(Debug, Clone, PartialEq)]
7pub enum Token {
8 IntLiteral(i64),
10 FloatLiteral(f64),
11 StringLiteral(String),
12 CharLiteral(char),
13 BoolLiteral(bool),
14
15 Ident(String),
17
18 Let,
20 Mut,
21 Fn,
22 Return,
23 If,
24 Else,
25 While,
26 Loop,
27 For,
28 In,
29 Break,
30 Continue,
31 Struct,
32 Impl,
33 Self_,
34 Enum,
35 Match,
36 Pub,
37 Use,
38 Mod,
39 As,
40 Ref,
41
42 I8,
44 I16,
45 I32,
46 I64,
47 I128,
48 U8,
49 U16,
50 U32,
51 U64,
52 U128,
53 F32,
54 F64,
55 Bool,
56 Char,
57 Str,
58 String_,
59 Usize,
60 Isize,
61
62 Plus,
64 Minus,
65 Star,
66 Slash,
67 Percent,
68 Eq,
69 EqEq,
70 NotEq,
71 Lt,
72 LtEq,
73 Gt,
74 GtEq,
75 And,
76 Or,
77 Not,
78 Ampersand,
79 Pipe,
80 Caret,
81 Tilde,
82 Shl,
83 Shr,
84 PlusEq,
85 MinusEq,
86 StarEq,
87 SlashEq,
88 PercentEq,
89
90 LParen,
92 RParen,
93 LBrace,
94 RBrace,
95 LBracket,
96 RBracket,
97
98 Comma,
100 Semicolon,
101 Colon,
102 ColonColon,
103 Arrow, FatArrow, Dot,
106 DotDot, DotDotEq, Hash, Underscore, Eof,
113}
114
115impl Token {
116 pub fn keyword_from_str(s: &str) -> Option<Token> {
118 match s {
119 "let" => Some(Token::Let),
120 "mut" => Some(Token::Mut),
121 "fn" => Some(Token::Fn),
122 "return" => Some(Token::Return),
123 "if" => Some(Token::If),
124 "else" => Some(Token::Else),
125 "while" => Some(Token::While),
126 "loop" => Some(Token::Loop),
127 "for" => Some(Token::For),
128 "in" => Some(Token::In),
129 "break" => Some(Token::Break),
130 "continue" => Some(Token::Continue),
131 "struct" => Some(Token::Struct),
132 "impl" => Some(Token::Impl),
133 "self" => Some(Token::Self_),
134 "enum" => Some(Token::Enum),
135 "match" => Some(Token::Match),
136 "pub" => Some(Token::Pub),
137 "use" => Some(Token::Use),
138 "mod" => Some(Token::Mod),
139 "as" => Some(Token::As),
140 "ref" => Some(Token::Ref),
141 "true" => Some(Token::BoolLiteral(true)),
142 "false" => Some(Token::BoolLiteral(false)),
143 "i8" => Some(Token::I8),
144 "i16" => Some(Token::I16),
145 "i32" => Some(Token::I32),
146 "i64" => Some(Token::I64),
147 "i128" => Some(Token::I128),
148 "u8" => Some(Token::U8),
149 "u16" => Some(Token::U16),
150 "u32" => Some(Token::U32),
151 "u64" => Some(Token::U64),
152 "u128" => Some(Token::U128),
153 "f32" => Some(Token::F32),
154 "f64" => Some(Token::F64),
155 "bool" => Some(Token::Bool),
156 "char" => Some(Token::Char),
157 "str" => Some(Token::Str),
158 "String" => Some(Token::String_),
159 "usize" => Some(Token::Usize),
160 "isize" => Some(Token::Isize),
161 "_" => Some(Token::Underscore),
162 _ => None,
163 }
164 }
165}
166
167impl std::fmt::Display for Token {
168 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
169 match self {
170 Token::IntLiteral(n) => write!(f, "{}", n),
171 Token::FloatLiteral(n) => write!(f, "{}", n),
172 Token::StringLiteral(s) => write!(f, "\"{}\"", s),
173 Token::CharLiteral(c) => write!(f, "'{}'", c),
174 Token::BoolLiteral(b) => write!(f, "{}", b),
175 Token::Ident(s) => write!(f, "{}", s),
176 Token::Let => write!(f, "let"),
177 Token::Mut => write!(f, "mut"),
178 Token::Fn => write!(f, "fn"),
179 Token::Return => write!(f, "return"),
180 Token::If => write!(f, "if"),
181 Token::Else => write!(f, "else"),
182 Token::While => write!(f, "while"),
183 Token::Loop => write!(f, "loop"),
184 Token::For => write!(f, "for"),
185 Token::In => write!(f, "in"),
186 Token::Break => write!(f, "break"),
187 Token::Continue => write!(f, "continue"),
188 Token::Struct => write!(f, "struct"),
189 Token::Impl => write!(f, "impl"),
190 Token::Self_ => write!(f, "self"),
191 Token::Enum => write!(f, "enum"),
192 Token::Match => write!(f, "match"),
193 _ => write!(f, "{:?}", self),
194 }
195 }
196}