use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Token {
Illegal,
Eof,
Ident(String),
Int(i32),
String(String),
Assign,
Plus,
Minus,
Bang,
Asterisk,
Slash,
Lt,
Gt,
Eq,
NotEq,
Comma,
Semicolon,
Colon,
LParen,
RParen,
LBrace,
RBrace,
LBracket,
RBracket,
Function,
Let,
True,
False,
If,
Else,
Return,
}
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Token::Illegal => write!(f, "ILLEGAL"),
Token::Eof => write!(f, "EOF"),
Token::Ident(id) => write!(f, "{}", id),
Token::Int(i) => write!(f, "{}", i),
Token::Assign => write!(f, "="),
Token::Plus => write!(f, "+"),
Token::Minus => write!(f, "-"),
Token::Bang => write!(f, "!"),
Token::Asterisk => write!(f, "*"),
Token::Slash => write!(f, "/"),
Token::Lt => write!(f, "<"),
Token::Gt => write!(f, ">"),
Token::Eq => write!(f, "=="),
Token::NotEq => write!(f, "!="),
Token::Comma => write!(f, ","),
Token::Semicolon => write!(f, ";"),
Token::LParen => write!(f, "("),
Token::RParen => write!(f, ")"),
Token::LBrace => write!(f, "{{"),
Token::RBrace => write!(f, "}}"),
Token::Function => write!(f, "FUNCTION"),
Token::Let => write!(f, "LET"),
Token::True => write!(f, "TRUE"),
Token::False => write!(f, "FALSE"),
Token::If => write!(f, "IF"),
Token::Else => write!(f, "ELSE"),
Token::Return => write!(f, "RETURN"),
Token::String(str) => write!(f, "{}", str),
Token::LBracket => write!(f, "["),
Token::RBracket => write!(f, "]"),
Token::Colon => write!(f, ":"),
}
}
}
pub fn lookup_ident(ident: &str) -> Token {
match ident {
"fn" => Token::Function,
"let" => Token::Let,
"true" => Token::True,
"false" => Token::False,
"if" => Token::If,
"else" => Token::Else,
"return" => Token::Return,
_ => Token::Ident(ident.to_string()),
}
}