patch_prolog_frontend/tokenizer/
token.rs1#[derive(Debug, Clone, PartialEq)]
8pub enum TokenKind {
9 Atom(String), Variable(String), Integer(i64),
13 Float(f64),
14
15 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,
63}
64
65impl std::fmt::Display for TokenKind {
66 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71 match self {
72 TokenKind::Atom(s) => write!(f, "atom `{s}`"),
73 TokenKind::Variable(s) => write!(f, "variable `{s}`"),
74 TokenKind::Integer(n) => write!(f, "integer `{n}`"),
75 TokenKind::Float(x) => write!(f, "float `{x}`"),
76 TokenKind::Neck => f.write_str("`:-`"),
77 TokenKind::QueryOp => f.write_str("`?-`"),
78 TokenKind::Equals => f.write_str("`=`"),
79 TokenKind::NotEquals => f.write_str("`\\=`"),
80 TokenKind::TermEq => f.write_str("`==`"),
81 TokenKind::TermNeq => f.write_str("`\\==`"),
82 TokenKind::Is => f.write_str("`is`"),
83 TokenKind::Lt => f.write_str("`<`"),
84 TokenKind::Gt => f.write_str("`>`"),
85 TokenKind::Lte => f.write_str("`=<`"),
86 TokenKind::Gte => f.write_str("`>=`"),
87 TokenKind::ArithEq => f.write_str("`=:=`"),
88 TokenKind::ArithNeq => f.write_str("`=\\=`"),
89 TokenKind::Plus => f.write_str("`+`"),
90 TokenKind::Minus => f.write_str("`-`"),
91 TokenKind::Star => f.write_str("`*`"),
92 TokenKind::Slash => f.write_str("`/`"),
93 TokenKind::IntDiv => f.write_str("`//`"),
94 TokenKind::Mod => f.write_str("`mod`"),
95 TokenKind::Rem => f.write_str("`rem`"),
96 TokenKind::Not => f.write_str("`\\+`"),
97 TokenKind::Backslash => f.write_str("`\\`"),
98 TokenKind::Pow => f.write_str("`**`"),
99 TokenKind::Caret => f.write_str("`^`"),
100 TokenKind::Colon => f.write_str("`:`"),
101 TokenKind::ShiftLeft => f.write_str("`<<`"),
102 TokenKind::ShiftRight => f.write_str("`>>`"),
103 TokenKind::Div => f.write_str("`div`"),
104 TokenKind::BitAnd => f.write_str("`/\\`"),
105 TokenKind::BitOr => f.write_str("`\\/`"),
106 TokenKind::Xor => f.write_str("`xor`"),
107 TokenKind::Cut => f.write_str("`!`"),
108 TokenKind::Arrow => f.write_str("`->`"),
109 TokenKind::Semicolon => f.write_str("`;`"),
110 TokenKind::Dot => f.write_str("`.`"),
111 TokenKind::Comma => f.write_str("`,`"),
112 TokenKind::LParen => f.write_str("`(`"),
113 TokenKind::RParen => f.write_str("`)`"),
114 TokenKind::LBracket => f.write_str("`[`"),
115 TokenKind::RBracket => f.write_str("`]`"),
116 TokenKind::Pipe => f.write_str("`|`"),
117 TokenKind::Eof => f.write_str("end of input"),
118 }
119 }
120}
121
122#[derive(Debug, Clone, PartialEq)]
123pub struct Token {
124 pub kind: TokenKind,
125 pub line: usize,
126 pub col: usize,
127 pub lo: u32,
129 pub hi: u32,
131}
132
133impl Token {
134 pub fn new(kind: TokenKind, line: usize, col: usize) -> Self {
138 Token {
139 kind,
140 line,
141 col,
142 lo: 0,
143 hi: 0,
144 }
145 }
146}