use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum TokenType {
LParen, RParen, LBrace, RBrace,
LeftParen, RightParen, LeftBrace, RightBrace,
Comma, Colon, Dot, Minus, Plus, Semicolon, Slash, Star,
LBracket, RBracket,
Bang, BangEqual,
Equal, EqualEqual,
Greater, GreaterEqual, Gt, Gte,
Less, LessEqual, Lt, Lte,
Percent,
Arrow, FatArrow, Scope,
AndAnd, OrOr,
Assign,
String(String),
Number(f64),
Identifier(String),
True, False, Null,
Bool(bool),
Newline,
Import,
System,
PlusAssign, MinusAssign, StarAssign, SlashAssign,
Eq, Neq,
Not,
And, Class, Else, Elif, Fn, For, If, In,
Let, Const, Or, Print, Return,
Super, This, Var, While, Break, Continue,
Comment(String),
Eof,
}
#[derive(Debug, Clone)]
pub struct Token {
pub token_type: TokenType,
pub lexeme: String,
pub line: usize,
pub column: usize,
}
impl fmt::Display for TokenType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TokenType::String(s) => write!(f, "STRING({})", s),
TokenType::Number(n) => write!(f, "NUMBER({})", n),
TokenType::Comment(s) => write!(f, "COMMENT({})", s),
TokenType::Identifier(_) => write!(f, "IDENTIFIER"),
_ => write!(f, "{:?}", self),
}
}
}