use crate::span::Span;
#[derive(Debug, Clone, PartialEq)]
pub struct Token {
pub kind: TokenKind,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TokenKind {
IntLit(i64),
FloatLit(f64),
StringLit(String),
CharLit(char),
Ident(String), UpperIdent(String), TyVar(String),
Val,
Fun,
Fn,
Let,
In,
End,
If,
Then,
Else,
Case,
Of,
Datatype,
Type,
Local,
And,
Rec,
Use,
True,
False,
Not,
Andalso,
Orelse,
Mod,
As,
Effect,
Handle,
With,
Perform,
Resume,
Return,
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,
}
impl TokenKind {
pub fn keyword_from_str(s: &str) -> Option<TokenKind> {
match s {
"val" => Some(TokenKind::Val),
"fun" => Some(TokenKind::Fun),
"fn" => Some(TokenKind::Fn),
"let" => Some(TokenKind::Let),
"in" => Some(TokenKind::In),
"end" => Some(TokenKind::End),
"if" => Some(TokenKind::If),
"then" => Some(TokenKind::Then),
"else" => Some(TokenKind::Else),
"case" => Some(TokenKind::Case),
"of" => Some(TokenKind::Of),
"datatype" => Some(TokenKind::Datatype),
"type" => Some(TokenKind::Type),
"local" => Some(TokenKind::Local),
"and" => Some(TokenKind::And),
"rec" => Some(TokenKind::Rec),
"use" => Some(TokenKind::Use),
"true" => Some(TokenKind::True),
"false" => Some(TokenKind::False),
"not" => Some(TokenKind::Not),
"andalso" => Some(TokenKind::Andalso),
"orelse" => Some(TokenKind::Orelse),
"mod" => Some(TokenKind::Mod),
"as" => Some(TokenKind::As),
"effect" => Some(TokenKind::Effect),
"handle" => Some(TokenKind::Handle),
"with" => Some(TokenKind::With),
"perform" => Some(TokenKind::Perform),
"resume" => Some(TokenKind::Resume),
"return" => Some(TokenKind::Return),
_ => None,
}
}
}