use crate::diagnostics::Span;
use std::fmt;
use super::TokenKind;
#[derive(Debug, Clone, PartialEq)]
pub struct Token {
pub kind: TokenKind,
pub span: Span,
pub text: String,
pub lexeme: String,
}
impl Token {
pub fn new(kind: TokenKind, span: Span, text: String) -> Self {
Self {
kind,
span,
lexeme: text.clone(),
text
}
}
pub fn eof(span: Span) -> Self {
Self::new(TokenKind::Eof, span, "".to_string())
}
pub fn is_open_paren(&self) -> bool {
matches!(self.kind, TokenKind::LeftParen)
}
pub fn is_close_paren(&self) -> bool {
matches!(self.kind, TokenKind::RightParen)
}
pub fn is_eof(&self) -> bool {
matches!(self.kind, TokenKind::Eof)
}
pub fn is_literal(&self) -> bool {
matches!(
self.kind,
TokenKind::IntegerNumber | TokenKind::RealNumber | TokenKind::RationalNumber | TokenKind::ComplexNumber |
TokenKind::String | TokenKind::Character | TokenKind::Boolean
)
}
}
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.text.is_empty() {
write!(f, "{:?}", self.kind)
} else {
write!(f, "{}", self.text)
}
}
}