1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[allow(non_camel_case_types)]
11pub enum TokenType {
12 EOF,
14 SPACE,
16 TAB,
18 NEWLINE,
20 CR,
22 FORM_FEED,
24 NOT,
26 AND,
28 OR,
30 BETWEEN,
32 LIKE,
34 ESCAPE,
36 IN,
38 IS,
40 TRUE,
42 FALSE,
44 NULL,
46 EQ,
48 NE,
50 GT,
52 GE,
54 LT,
56 LE,
58 LPAREN,
60 COMMA,
62 RPAREN,
64 PLUS,
66 MINUS,
68 STAR,
70 SLASH,
72 PERCENT,
74 LINE_COMMENT,
76 BLOCK_COMMENT,
78 DECIMAL_LITERAL,
80 HEX_LITERAL,
82 OCTAL_LITERAL,
84 FLOATING_POINT_LITERAL,
86 STRING_LITERAL,
88 ID,
90 INVALID,
92}
93
94impl fmt::Display for TokenType {
95 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96 match self {
97 TokenType::EOF => write!(f, "EOF"),
98 TokenType::SPACE => write!(f, "SPACE"),
99 TokenType::TAB => write!(f, "TAB"),
100 TokenType::NEWLINE => write!(f, "NEWLINE"),
101 TokenType::CR => write!(f, "CR"),
102 TokenType::FORM_FEED => write!(f, "FORM_FEED"),
103 TokenType::NOT => write!(f, "NOT"),
104 TokenType::AND => write!(f, "AND"),
105 TokenType::OR => write!(f, "OR"),
106 TokenType::BETWEEN => write!(f, "BETWEEN"),
107 TokenType::LIKE => write!(f, "LIKE"),
108 TokenType::ESCAPE => write!(f, "ESCAPE"),
109 TokenType::IN => write!(f, "IN"),
110 TokenType::IS => write!(f, "IS"),
111 TokenType::TRUE => write!(f, "TRUE"),
112 TokenType::FALSE => write!(f, "FALSE"),
113 TokenType::NULL => write!(f, "NULL"),
114 TokenType::EQ => write!(f, "="),
115 TokenType::NE => write!(f, "<>"),
116 TokenType::GT => write!(f, ">"),
117 TokenType::GE => write!(f, ">="),
118 TokenType::LT => write!(f, "<"),
119 TokenType::LE => write!(f, "<="),
120 TokenType::LPAREN => write!(f, "("),
121 TokenType::COMMA => write!(f, ","),
122 TokenType::RPAREN => write!(f, ")"),
123 TokenType::PLUS => write!(f, "+"),
124 TokenType::MINUS => write!(f, "-"),
125 TokenType::STAR => write!(f, "*"),
126 TokenType::SLASH => write!(f, "/"),
127 TokenType::PERCENT => write!(f, "%"),
128 TokenType::LINE_COMMENT => write!(f, "LINE_COMMENT"),
129 TokenType::BLOCK_COMMENT => write!(f, "BLOCK_COMMENT"),
130 TokenType::DECIMAL_LITERAL => write!(f, "DECIMAL_LITERAL"),
131 TokenType::HEX_LITERAL => write!(f, "HEX_LITERAL"),
132 TokenType::OCTAL_LITERAL => write!(f, "OCTAL_LITERAL"),
133 TokenType::FLOATING_POINT_LITERAL => write!(f, "FLOATING_POINT_LITERAL"),
134 TokenType::STRING_LITERAL => write!(f, "STRING_LITERAL"),
135 TokenType::ID => write!(f, "ID"),
136 TokenType::INVALID => write!(f, "INVALID"),
137 }
138 }
139}
140
141#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
145#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
146pub enum LexicalState {
147 DEFAULT,
149}
150
151#[derive(Debug, Clone)]
159#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
160pub struct Token {
161 pub token_type: TokenType,
163 pub image: String,
165 pub begin_offset: usize,
167 pub end_offset: usize,
169 pub next: Option<usize>,
171 pub previous: Option<usize>,
173}
174
175impl Token {
176 pub fn new(
178 token_type: TokenType,
179 image: String,
180 begin_offset: usize,
181 end_offset: usize,
182 ) -> Self {
183 Token {
184 token_type,
185 image,
186 begin_offset,
187 end_offset,
188 next: None,
189 previous: None,
190 }
191 }
192
193 pub fn len(&self) -> usize {
195 self.end_offset.saturating_sub(self.begin_offset)
196 }
197
198 pub fn is_empty(&self) -> bool {
200 self.len() == 0
201 }
202
203 pub fn is_type(&self, token_type: TokenType) -> bool {
205 self.token_type == token_type
206 }
207
208 pub fn is_one_of(&self, types: &[TokenType]) -> bool {
210 types.contains(&self.token_type)
211 }
212}
213
214impl fmt::Display for Token {
215 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
216 write!(f, "{}: \"{}\"", self.token_type, self.image)
217 }
218}
219
220pub trait TokenSource {
222 fn get_line_from_offset(&self, offset: usize) -> usize;
224
225 fn get_column_from_offset(&self, offset: usize) -> usize;
227}