1use std::fmt;
2
3#[derive(Debug, Clone, PartialEq)]
5pub enum StringSegment {
6 Literal(String),
7 Expression(String),
8}
9
10impl fmt::Display for StringSegment {
11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12 match self {
13 StringSegment::Literal(s) => write!(f, "{s}"),
14 StringSegment::Expression(e) => write!(f, "${{{e}}}"),
15 }
16 }
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub struct Span {
22 pub start: usize,
24 pub end: usize,
26 pub line: usize,
28 pub column: usize,
30 pub end_line: usize,
32}
33
34impl Span {
35 pub fn with_offsets(start: usize, end: usize, line: usize, column: usize) -> Self {
36 Self {
37 start,
38 end,
39 line,
40 column,
41 end_line: line,
42 }
43 }
44
45 pub fn merge(a: Span, b: Span) -> Span {
47 Span {
48 start: a.start,
49 end: b.end,
50 line: a.line,
51 column: a.column,
52 end_line: b.end_line,
53 }
54 }
55
56 pub fn dummy() -> Self {
58 Self {
59 start: 0,
60 end: 0,
61 line: 0,
62 column: 0,
63 end_line: 0,
64 }
65 }
66}
67
68impl fmt::Display for Span {
69 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70 write!(f, "{}:{}", self.line, self.column)
71 }
72}
73
74#[derive(Debug, Clone, PartialEq)]
76pub enum TokenKind {
77 Pipeline,
79 Extends,
80 Override,
81 Let,
82 Var,
83 If,
84 Else,
85 For,
86 In,
87 Match,
88 Retry,
89 Parallel,
90 ParallelMap,
91 ParallelSettle,
92 Return,
93 Import,
94 True,
95 False,
96 Nil,
97 Try,
98 Catch,
99 Throw,
100 Finally,
101 Fn,
102 Spawn,
103 While,
104 TypeKw,
105 Enum,
106 Struct,
107 Interface,
108 Pub,
109 From,
110 Thru,
111 Upto,
112 Guard,
113 Ask,
114 Deadline,
115 Yield,
116 Mutex,
117 Break,
118 Continue,
119 Select,
120 Impl,
121
122 Identifier(String),
124 StringLiteral(String),
125 InterpolatedString(Vec<StringSegment>),
126 IntLiteral(i64),
127 FloatLiteral(f64),
128 DurationLiteral(u64),
130
131 Eq, Neq, And, Or, Pipe, NilCoal, QuestionDot, Arrow, Lte, Gte, PlusAssign, MinusAssign, StarAssign, SlashAssign, PercentAssign, Assign, Not, Dot, Plus, Minus, Star, Slash, Percent, Lt, Gt, Question, Bar, LBrace, RBrace, LParen, RParen, LBracket, RBracket, Comma, Colon, Semicolon, LineComment(String), BlockComment(String), Newline,
179 Eof,
180}
181
182impl fmt::Display for TokenKind {
183 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
184 match self {
185 TokenKind::Pipeline => write!(f, "pipeline"),
186 TokenKind::Extends => write!(f, "extends"),
187 TokenKind::Override => write!(f, "override"),
188 TokenKind::Let => write!(f, "let"),
189 TokenKind::Var => write!(f, "var"),
190 TokenKind::If => write!(f, "if"),
191 TokenKind::Else => write!(f, "else"),
192 TokenKind::For => write!(f, "for"),
193 TokenKind::In => write!(f, "in"),
194 TokenKind::Match => write!(f, "match"),
195 TokenKind::Retry => write!(f, "retry"),
196 TokenKind::Parallel => write!(f, "parallel"),
197 TokenKind::ParallelMap => write!(f, "parallel_map"),
198 TokenKind::ParallelSettle => write!(f, "parallel_settle"),
199 TokenKind::Return => write!(f, "return"),
200 TokenKind::Import => write!(f, "import"),
201 TokenKind::True => write!(f, "true"),
202 TokenKind::False => write!(f, "false"),
203 TokenKind::Nil => write!(f, "nil"),
204 TokenKind::Try => write!(f, "try"),
205 TokenKind::Catch => write!(f, "catch"),
206 TokenKind::Throw => write!(f, "throw"),
207 TokenKind::Finally => write!(f, "finally"),
208 TokenKind::Fn => write!(f, "fn"),
209 TokenKind::Spawn => write!(f, "spawn"),
210 TokenKind::While => write!(f, "while"),
211 TokenKind::TypeKw => write!(f, "type"),
212 TokenKind::Enum => write!(f, "enum"),
213 TokenKind::Struct => write!(f, "struct"),
214 TokenKind::Interface => write!(f, "interface"),
215 TokenKind::Pub => write!(f, "pub"),
216 TokenKind::From => write!(f, "from"),
217 TokenKind::Thru => write!(f, "thru"),
218 TokenKind::Upto => write!(f, "upto"),
219 TokenKind::Guard => write!(f, "guard"),
220 TokenKind::Ask => write!(f, "ask"),
221 TokenKind::Deadline => write!(f, "deadline"),
222 TokenKind::Yield => write!(f, "yield"),
223 TokenKind::Mutex => write!(f, "mutex"),
224 TokenKind::Break => write!(f, "break"),
225 TokenKind::Continue => write!(f, "continue"),
226 TokenKind::Select => write!(f, "select"),
227 TokenKind::Impl => write!(f, "impl"),
228 TokenKind::Identifier(s) => write!(f, "id({s})"),
229 TokenKind::StringLiteral(s) => write!(f, "str({s})"),
230 TokenKind::InterpolatedString(_) => write!(f, "istr(...)"),
231 TokenKind::IntLiteral(n) => write!(f, "int({n})"),
232 TokenKind::FloatLiteral(n) => write!(f, "float({n})"),
233 TokenKind::DurationLiteral(ms) => write!(f, "duration({ms}ms)"),
234 TokenKind::Eq => write!(f, "=="),
235 TokenKind::Neq => write!(f, "!="),
236 TokenKind::And => write!(f, "&&"),
237 TokenKind::Or => write!(f, "||"),
238 TokenKind::Pipe => write!(f, "|>"),
239 TokenKind::NilCoal => write!(f, "??"),
240 TokenKind::QuestionDot => write!(f, "?."),
241 TokenKind::Arrow => write!(f, "->"),
242 TokenKind::Lte => write!(f, "<="),
243 TokenKind::Gte => write!(f, ">="),
244 TokenKind::PlusAssign => write!(f, "+="),
245 TokenKind::MinusAssign => write!(f, "-="),
246 TokenKind::StarAssign => write!(f, "*="),
247 TokenKind::SlashAssign => write!(f, "/="),
248 TokenKind::PercentAssign => write!(f, "%="),
249 TokenKind::Assign => write!(f, "="),
250 TokenKind::Not => write!(f, "!"),
251 TokenKind::Dot => write!(f, "."),
252 TokenKind::Plus => write!(f, "+"),
253 TokenKind::Minus => write!(f, "-"),
254 TokenKind::Star => write!(f, "*"),
255 TokenKind::Slash => write!(f, "/"),
256 TokenKind::Percent => write!(f, "%"),
257 TokenKind::Lt => write!(f, "<"),
258 TokenKind::Gt => write!(f, ">"),
259 TokenKind::Question => write!(f, "?"),
260 TokenKind::Bar => write!(f, "|"),
261 TokenKind::LBrace => write!(f, "{{"),
262 TokenKind::RBrace => write!(f, "}}"),
263 TokenKind::LParen => write!(f, "("),
264 TokenKind::RParen => write!(f, ")"),
265 TokenKind::LBracket => write!(f, "["),
266 TokenKind::RBracket => write!(f, "]"),
267 TokenKind::Comma => write!(f, ","),
268 TokenKind::Colon => write!(f, ":"),
269 TokenKind::Semicolon => write!(f, ";"),
270 TokenKind::LineComment(s) => write!(f, "// {s}"),
271 TokenKind::BlockComment(s) => write!(f, "/* {s} */"),
272 TokenKind::Newline => write!(f, "\\n"),
273 TokenKind::Eof => write!(f, "EOF"),
274 }
275 }
276}
277
278#[derive(Debug, Clone, PartialEq)]
280pub struct Token {
281 pub kind: TokenKind,
282 pub span: Span,
283}
284
285impl Token {
286 pub fn with_span(kind: TokenKind, span: Span) -> Self {
287 Self { kind, span }
288 }
289}