#[derive(Debug, Clone, PartialEq)]
pub enum TokenKind {
Atom(String), Variable(String), Integer(i64),
Float(f64),
Neck, QueryOp, Equals, NotEquals, TermEq, TermNeq, Is, Lt, Gt, Lte, Gte, ArithEq, ArithNeq, Plus, Minus, Star, Slash, IntDiv, Mod, Rem, Not, Backslash, Cut, Arrow, Semicolon, Pow, Caret, Colon, ShiftLeft, ShiftRight, Div, BitAnd, BitOr, Xor,
Dot, Comma, LParen, RParen, LBracket, RBracket, Pipe,
Eof,
}
impl std::fmt::Display for TokenKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TokenKind::Atom(s) => write!(f, "atom `{s}`"),
TokenKind::Variable(s) => write!(f, "variable `{s}`"),
TokenKind::Integer(n) => write!(f, "integer `{n}`"),
TokenKind::Float(x) => write!(f, "float `{x}`"),
TokenKind::Neck => f.write_str("`:-`"),
TokenKind::QueryOp => f.write_str("`?-`"),
TokenKind::Equals => f.write_str("`=`"),
TokenKind::NotEquals => f.write_str("`\\=`"),
TokenKind::TermEq => f.write_str("`==`"),
TokenKind::TermNeq => f.write_str("`\\==`"),
TokenKind::Is => f.write_str("`is`"),
TokenKind::Lt => f.write_str("`<`"),
TokenKind::Gt => f.write_str("`>`"),
TokenKind::Lte => f.write_str("`=<`"),
TokenKind::Gte => f.write_str("`>=`"),
TokenKind::ArithEq => f.write_str("`=:=`"),
TokenKind::ArithNeq => f.write_str("`=\\=`"),
TokenKind::Plus => f.write_str("`+`"),
TokenKind::Minus => f.write_str("`-`"),
TokenKind::Star => f.write_str("`*`"),
TokenKind::Slash => f.write_str("`/`"),
TokenKind::IntDiv => f.write_str("`//`"),
TokenKind::Mod => f.write_str("`mod`"),
TokenKind::Rem => f.write_str("`rem`"),
TokenKind::Not => f.write_str("`\\+`"),
TokenKind::Backslash => f.write_str("`\\`"),
TokenKind::Pow => f.write_str("`**`"),
TokenKind::Caret => f.write_str("`^`"),
TokenKind::Colon => f.write_str("`:`"),
TokenKind::ShiftLeft => f.write_str("`<<`"),
TokenKind::ShiftRight => f.write_str("`>>`"),
TokenKind::Div => f.write_str("`div`"),
TokenKind::BitAnd => f.write_str("`/\\`"),
TokenKind::BitOr => f.write_str("`\\/`"),
TokenKind::Xor => f.write_str("`xor`"),
TokenKind::Cut => f.write_str("`!`"),
TokenKind::Arrow => f.write_str("`->`"),
TokenKind::Semicolon => f.write_str("`;`"),
TokenKind::Dot => f.write_str("`.`"),
TokenKind::Comma => f.write_str("`,`"),
TokenKind::LParen => f.write_str("`(`"),
TokenKind::RParen => f.write_str("`)`"),
TokenKind::LBracket => f.write_str("`[`"),
TokenKind::RBracket => f.write_str("`]`"),
TokenKind::Pipe => f.write_str("`|`"),
TokenKind::Eof => f.write_str("end of input"),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Token {
pub kind: TokenKind,
pub line: usize,
pub col: usize,
pub lo: u32,
pub hi: u32,
}
impl Token {
pub fn new(kind: TokenKind, line: usize, col: usize) -> Self {
Token {
kind,
line,
col,
lo: 0,
hi: 0,
}
}
}