1use crate::span::Span;
2
3#[derive(Debug, Clone, PartialEq)]
4pub struct Token {
5 pub kind: TokenKind,
6 pub span: Span,
7}
8
9#[derive(Debug, Clone, PartialEq)]
10pub enum TokenKind {
11 IntLit(i64),
13 FloatLit(f64),
14 StringLit(String),
15 CharLit(char),
16
17 Ident(String), UpperIdent(String), TyVar(String), Val,
24 Fun,
25 Fn,
26 Let,
27 In,
28 End,
29 If,
30 Then,
31 Else,
32 Case,
33 Of,
34 Datatype,
35 Type,
36 Local,
37 And,
38 Rec,
39 Use,
40 True,
41 False,
42 Not,
43 Andalso,
44 Orelse,
45 Mod,
46 As,
47 Effect,
48 Handle,
49 With,
50 Perform,
51 Resume,
52 Return,
53
54 Plus, Minus, Star, Slash, PlusDot, MinusDot, StarDot, SlashDot, Caret, Lt, Gt, Le, Ge, LtDot, GtDot, LeDot, GeDot, Eq, Ne, Tilde, ColonColon, Arrow, ThinArrow, Bar, LParen, RParen, LBracket, RBracket, Comma, Colon, Semicolon, Underscore, Hash, Eof,
105}
106
107impl TokenKind {
108 pub fn keyword_from_str(s: &str) -> Option<TokenKind> {
109 match s {
110 "val" => Some(TokenKind::Val),
111 "fun" => Some(TokenKind::Fun),
112 "fn" => Some(TokenKind::Fn),
113 "let" => Some(TokenKind::Let),
114 "in" => Some(TokenKind::In),
115 "end" => Some(TokenKind::End),
116 "if" => Some(TokenKind::If),
117 "then" => Some(TokenKind::Then),
118 "else" => Some(TokenKind::Else),
119 "case" => Some(TokenKind::Case),
120 "of" => Some(TokenKind::Of),
121 "datatype" => Some(TokenKind::Datatype),
122 "type" => Some(TokenKind::Type),
123 "local" => Some(TokenKind::Local),
124 "and" => Some(TokenKind::And),
125 "rec" => Some(TokenKind::Rec),
126 "use" => Some(TokenKind::Use),
127 "true" => Some(TokenKind::True),
128 "false" => Some(TokenKind::False),
129 "not" => Some(TokenKind::Not),
130 "andalso" => Some(TokenKind::Andalso),
131 "orelse" => Some(TokenKind::Orelse),
132 "mod" => Some(TokenKind::Mod),
133 "as" => Some(TokenKind::As),
134 "effect" => Some(TokenKind::Effect),
135 "handle" => Some(TokenKind::Handle),
136 "with" => Some(TokenKind::With),
137 "perform" => Some(TokenKind::Perform),
138 "resume" => Some(TokenKind::Resume),
139 "return" => Some(TokenKind::Return),
140 _ => None,
141 }
142 }
143}