1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum TokenKind {
9 Ident, IdentFunction, IdentParameter, IdentVariable, MacroExpand,
15
16 FloatType,
18 IntegerType,
19 StringType,
20 StructType,
21
22 Float,
24 Int,
25 Str,
26
27 OpSum, OpMinus, OpProduct, OpDivide, OpEqual, OpNotEqual, OpLessThan, OpLessEqual, OpGreaterThan, OpGreaterEqual, OpModulo, OpExponent, OpAt, OpAnd, OpOr, OpPipe, OpPipeMacro, OpUnknown, SelfLit,
49 Now,
50 SampleRate,
51
52 Comma, Dot, DoubleDot, Colon, DoubleColon, SemiColon, Let,
62 LetRec,
63 Assign, ParenBegin, ParenEnd, ArrayBegin, ArrayEnd, BlockBegin, BlockEnd, LambdaArgBeginEnd, BackQuote, Dollar, Function, Macro, Arrow, LeftArrow, FatArrow, PlaceHolder, If,
84 Else,
85 Match, Include,
89 Sharp, StageKwd, Main, Mod, Use, Pub, Type, Alias, Rec, LineBreak,
103 Whitespace,
104 SingleLineComment,
105 MultiLineComment,
106
107 Error, Eof,
110}
111
112impl fmt::Display for TokenKind {
113 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
114 match self {
115 TokenKind::Ident => write!(f, "identifier"),
116 TokenKind::IdentFunction => write!(f, "identifier_function"),
117 TokenKind::IdentParameter => write!(f, "identifier_parameter"),
118 TokenKind::IdentVariable => write!(f, "identifier_variable"),
119 TokenKind::MacroExpand => write!(f, "macro_expand"),
120 TokenKind::FloatType => write!(f, "float"),
121 TokenKind::IntegerType => write!(f, "int"),
122 TokenKind::StringType => write!(f, "string"),
123 TokenKind::StructType => write!(f, "struct"),
124 TokenKind::Float => write!(f, "float_literal"),
125 TokenKind::Int => write!(f, "int_literal"),
126 TokenKind::Str => write!(f, "string_literal"),
127 TokenKind::OpSum => write!(f, "+"),
128 TokenKind::OpMinus => write!(f, "-"),
129 TokenKind::OpProduct => write!(f, "*"),
130 TokenKind::OpDivide => write!(f, "/"),
131 TokenKind::OpEqual => write!(f, "=="),
132 TokenKind::OpNotEqual => write!(f, "!="),
133 TokenKind::OpLessThan => write!(f, "<"),
134 TokenKind::OpLessEqual => write!(f, "<="),
135 TokenKind::OpGreaterThan => write!(f, ">"),
136 TokenKind::OpGreaterEqual => write!(f, ">="),
137 TokenKind::OpModulo => write!(f, "%"),
138 TokenKind::OpExponent => write!(f, "^"),
139 TokenKind::OpAt => write!(f, "@"),
140 TokenKind::OpAnd => write!(f, "&&"),
141 TokenKind::OpOr => write!(f, "||"),
142 TokenKind::OpPipe => write!(f, "|>"),
143 TokenKind::OpPipeMacro => write!(f, "||>"),
144 TokenKind::OpUnknown => write!(f, "unknown_op"),
145 TokenKind::SelfLit => write!(f, "self"),
146 TokenKind::Now => write!(f, "now"),
147 TokenKind::SampleRate => write!(f, "samplerate"),
148 TokenKind::Comma => write!(f, ","),
149 TokenKind::Dot => write!(f, "."),
150 TokenKind::DoubleDot => write!(f, ".."),
151 TokenKind::Colon => write!(f, ":"),
152 TokenKind::DoubleColon => write!(f, "::"),
153 TokenKind::SemiColon => write!(f, ";"),
154 TokenKind::Let => write!(f, "let"),
155 TokenKind::LetRec => write!(f, "letrec"),
156 TokenKind::Assign => write!(f, "="),
157 TokenKind::ParenBegin => write!(f, "("),
158 TokenKind::ParenEnd => write!(f, ")"),
159 TokenKind::ArrayBegin => write!(f, "["),
160 TokenKind::ArrayEnd => write!(f, "]"),
161 TokenKind::BlockBegin => write!(f, "{{"),
162 TokenKind::BlockEnd => write!(f, "}}"),
163 TokenKind::LambdaArgBeginEnd => write!(f, "|"),
164 TokenKind::Function => write!(f, "fn"),
165 TokenKind::Macro => write!(f, "macro"),
166 TokenKind::Arrow => write!(f, "->"),
167 TokenKind::LeftArrow => write!(f, "<-"),
168 TokenKind::FatArrow => write!(f, "=>"),
169 TokenKind::PlaceHolder => write!(f, "_"),
170 TokenKind::If => write!(f, "if"),
171 TokenKind::Else => write!(f, "else"),
172 TokenKind::Match => write!(f, "match"),
173 TokenKind::Include => write!(f, "include"),
174 TokenKind::LineBreak => write!(f, "linebreak"),
175 TokenKind::Whitespace => write!(f, "whitespace"),
176 TokenKind::SingleLineComment => write!(f, "single_line_comment"),
177 TokenKind::MultiLineComment => write!(f, "multi_line_comment"),
178 TokenKind::BackQuote => write!(f, "`"),
179 TokenKind::Dollar => write!(f, "$"),
180 TokenKind::StageKwd => write!(f, "stage"),
181 TokenKind::Main => write!(f, "main"),
182 TokenKind::Mod => write!(f, "mod"),
183 TokenKind::Use => write!(f, "use"),
184 TokenKind::Pub => write!(f, "pub"),
185 TokenKind::Type => write!(f, "type"),
186 TokenKind::Alias => write!(f, "alias"),
187 TokenKind::Rec => write!(f, "rec"),
188 TokenKind::Sharp => write!(f, "#"),
189 TokenKind::Error => write!(f, "error"),
190 TokenKind::Eof => write!(f, "eof"),
191 }
192 }
193}
194
195#[derive(Debug, Clone, Copy, PartialEq, Eq)]
198pub struct Token {
199 pub kind: TokenKind,
200 pub start: usize, pub length: usize, }
203
204impl Token {
205 pub fn new(kind: TokenKind, start: usize, length: usize) -> Self {
206 Self {
207 kind,
208 start,
209 length,
210 }
211 }
212
213 pub fn end(&self) -> usize {
215 self.start + self.length
216 }
217
218 pub fn text<'a>(&self, source: &'a str) -> &'a str {
220 &source[self.start..self.end()]
221 }
222
223 pub fn is_trivia(&self) -> bool {
225 matches!(
226 self.kind,
227 TokenKind::LineBreak
228 | TokenKind::Whitespace
229 | TokenKind::SingleLineComment
230 | TokenKind::MultiLineComment
231 )
232 }
233
234 pub fn is_error(&self) -> bool {
236 self.kind == TokenKind::Error
237 }
238}
239
240impl fmt::Display for Token {
241 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
242 write!(f, "{}@{}:{}", self.kind, self.start, self.length)
243 }
244}