use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum TokenKind {
Keyword,
Directive,
Identifier,
Number,
LabelDef,
Punctuation,
Eof,
}
impl fmt::Display for TokenKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TokenKind::Keyword => write!(f, "Keyword"),
TokenKind::Directive => write!(f, "Directive"),
TokenKind::Identifier => write!(f, "Identifier"),
TokenKind::Number => write!(f, "Number"),
TokenKind::LabelDef => write!(f, "LabelDef"),
TokenKind::Punctuation => write!(f, "Punctuation"),
TokenKind::Eof => write!(f, "EOF"),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Token {
pub kind: TokenKind,
pub value: String,
pub line: usize,
pub column: usize,
}
impl Token {
pub fn new(kind: TokenKind, value: String, line: usize, column: usize) -> Self {
Self { kind, value, line, column }
}
}
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}({}) at {}:{}", self.kind, self.value, self.line, self.column)
}
}