use crate::rustlite::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),
True,
False,
Ident(String),
Fn,
Let,
Mut,
If,
Else,
Match,
While,
Loop,
Break,
Continue,
Return,
Struct,
Enum,
Const,
Use,
I32,
I64,
F32,
F64,
Bool,
StringType,
LParen,
RParen,
LBrace,
RBrace,
LBracket,
RBracket,
Comma,
Colon,
ColonColon,
Semi,
Dot,
Arrow, FatArrow,
Plus,
Minus,
Star,
Slash,
Percent,
Bang,
Eq,
EqEq,
BangEq,
Lt,
Gt,
LtEq,
GtEq,
AmpAmp,
PipePipe,
Underscore,
Eof,
}
impl TokenKind {
pub fn keyword(s: &str) -> Option<TokenKind> {
match s {
"fn" => Some(TokenKind::Fn),
"let" => Some(TokenKind::Let),
"mut" => Some(TokenKind::Mut),
"if" => Some(TokenKind::If),
"else" => Some(TokenKind::Else),
"match" => Some(TokenKind::Match),
"while" => Some(TokenKind::While),
"loop" => Some(TokenKind::Loop),
"break" => Some(TokenKind::Break),
"continue" => Some(TokenKind::Continue),
"return" => Some(TokenKind::Return),
"struct" => Some(TokenKind::Struct),
"enum" => Some(TokenKind::Enum),
"const" => Some(TokenKind::Const),
"use" => Some(TokenKind::Use),
"true" => Some(TokenKind::True),
"false" => Some(TokenKind::False),
"i32" => Some(TokenKind::I32),
"i64" => Some(TokenKind::I64),
"f32" => Some(TokenKind::F32),
"f64" => Some(TokenKind::F64),
"bool" => Some(TokenKind::Bool),
"String" => Some(TokenKind::StringType),
"_" => Some(TokenKind::Underscore),
_ => None,
}
}
}