1use std::fmt::{Display, Formatter};
2
3use nom::Slice;
4
5use crate::Span;
6
7#[derive(Debug, PartialEq, Clone, Eq)]
8pub struct TokenPosition {
9 pub line: u32,
10 pub column: usize,
11}
12
13impl<'a> From<Span<'a>> for TokenPosition {
14 fn from(span: Span) -> Self {
15 TokenPosition {
16 line: span.location_line(),
17 column: span.get_utf8_column(),
18 }
19 }
20}
21
22#[derive(Debug, PartialEq, Clone, Eq)]
23pub struct TokenRange(pub TokenPosition, pub TokenPosition);
24
25impl Default for TokenRange {
26 fn default() -> Self {
27 TokenRange(
28 TokenPosition { line: 0, column: 0 },
29 TokenPosition { line: 0, column: 0 },
30 )
31 }
32}
33
34impl From<(Span<'_>, Span<'_>)> for TokenRange {
35 fn from((start, end): (Span, Span)) -> TokenRange {
36 TokenRange(TokenPosition::from(start), TokenPosition::from(end))
37 }
38}
39
40impl From<(Span<'_>, usize)> for TokenRange {
41 fn from((start, len): (Span, usize)) -> TokenRange {
42 TokenRange(
43 TokenPosition::from(start),
44 TokenPosition::from(start.slice(len..)),
45 )
46 }
47}
48
49impl From<(Span<'_>, usize, usize)> for TokenRange {
50 fn from((s, abs_offset_i, abs_offset_j): (Span, usize, usize)) -> Self {
51 TokenRange(
52 TokenPosition::from(s.slice(abs_offset_i..)),
53 TokenPosition::from(s.slice(abs_offset_j..)),
54 )
55 }
56}
57
58#[derive(Debug, PartialEq, Clone, Eq)]
59pub enum TokenKey {
60 Dummy,
61 DummySn(usize),
62 Sn(usize, TokenRange),
63 String(String, TokenRange),
64}
65
66#[derive(Debug, PartialEq, Clone)]
67pub struct TokenId(pub String, pub TokenRange);
68
69impl Display for TokenId {
70 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
71 write!(f, "{}", self.0)
72 }
73}
74
75impl TokenId {
76 pub fn name(&self) -> &str {
77 &self.0.as_str()
78 }
79}
80
81#[derive(Debug, PartialEq, Clone)]
83pub struct TokenDec(pub TokenId, pub Vec<Token>, pub TokenRange);
84
85#[derive(Debug, PartialEq, Clone)]
86pub enum Token {
87 Void,
88 TokenPrimNull(TokenRange),
89 TokenPrimNumberInt(i64, TokenRange),
90 TokenPrimNumberFloat(f64, TokenRange),
91 TokenPrimString(String, TokenRange),
92 TokenPrimBoolean(bool, TokenRange),
93 TokenVar(Vec<TokenKey>, TokenRange),
94 TokenComment(String, TokenRange),
95 TokenRefVarSibling(Vec<TokenKey>, TokenRange),
96 TokenRefVarUncle(Vec<TokenKey>, TokenRange),
97 TokenRefVarRoot(Vec<TokenKey>, TokenRange),
98 TokenFnCall(TokenId, Vec<Token>, TokenRange),
99 TokenExprSequence(Vec<Token>, TokenRange),
100 TokenFrameExprGroup(Box<Token>, TokenRange),
101 TokenFrameRoot(Vec<TokenDec>, Box<Token>, TokenRange), TokenFrameList(Vec<(TokenKey, Vec<TokenDec>, Token)>, TokenRange), TokenFrameDict(Vec<(TokenKey, Vec<TokenDec>, Token)>, TokenRange), TokenOpPipe(TokenRange),
105 TokenOpEq(TokenRange),
106 TokenOpNe(TokenRange),
107 TokenOpLe(TokenRange),
108 TokenOpGe(TokenRange),
109 TokenOpAnd(TokenRange),
110 TokenOpOr(TokenRange),
111 TokenOpNot(TokenRange),
112 TokenOpGt(TokenRange),
113 TokenOpLt(TokenRange),
114 TokenOpConcat(TokenRange),
115 TokenDummyOpConcat,
116 TokenOpAdd(TokenRange),
117 TokenOpSub(TokenRange),
118 TokenOpMul(TokenRange),
119 TokenOpDiv(TokenRange),
120 TokenOpMod(TokenRange),
121 TokenOpQ(TokenRange),
122 TokenOpColon(TokenRange),
123}
124
125impl Display for TokenKey {
126 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
127 match self {
128 TokenKey::Dummy => write!(f, "_"),
129 TokenKey::DummySn(i) => write!(f, "{}", i),
130 TokenKey::Sn(i, ..) => write!(f, "{}", i),
131 TokenKey::String(s, ..) => write!(f, "{}", s),
132 }
133 }
134}
135
136impl Default for Token {
137 fn default() -> Self {
138 Token::Void
139 }
140}
141
142impl Display for Token {
143 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
144 match self {
145 Token::Void => write!(f, "()"),
146 Token::TokenPrimNumberInt(v, _) => write!(f, "{}", v),
147 Token::TokenPrimNumberFloat(v, _) => write!(f, "{}", v),
148 Token::TokenPrimString(v, _) => write!(f, "{}", v),
149 Token::TokenPrimBoolean(v, _) => write!(f, "{}", v),
150 Token::TokenPrimNull(_) => write!(f, "null"),
151 Token::TokenFnCall(n, _, _) => write!(f, "{}(..)", n),
152 Token::TokenVar(v, _) => write!(
153 f,
154 "${}",
155 v.iter()
156 .map(|v| v.to_string())
157 .collect::<Vec<String>>()
158 .join(".")
159 ),
160 Token::TokenComment(v, _) => write!(f, "/* {} */", v),
161 Token::TokenRefVarSibling(v, _) => write!(f, "&sibling.{:?}", v),
162 Token::TokenRefVarUncle(v, _) => write!(f, "&uncle.{:?}", v),
163 Token::TokenRefVarRoot(v, _) => write!(f, "&root.{:?}", v),
164 Token::TokenFrameRoot(_, _, _) => write!(f, "base{{..}}"),
165 Token::TokenFrameDict(_, _) => write!(f, "{{..}}"),
166 Token::TokenFrameList(_, _) => write!(f, "[..]"),
167 Token::TokenExprSequence(s, _) => write!(f, "{:?}", s),
168 Token::TokenFrameExprGroup(s, _) => write!(f, "{:?}", s),
169 Token::TokenOpPipe(_) => write!(f, "|"),
170 Token::TokenOpEq(_) => write!(f, "=="),
171 Token::TokenOpNe(_) => write!(f, "!="),
172 Token::TokenOpLe(_) => write!(f, "<="),
173 Token::TokenOpGe(_) => write!(f, ">="),
174 Token::TokenOpAnd(_) => write!(f, "&&"),
175 Token::TokenOpOr(_) => write!(f, "||"),
176 Token::TokenOpNot(_) => write!(f, "!"),
177 Token::TokenOpGt(_) => write!(f, ">"),
178 Token::TokenOpLt(_) => write!(f, "<"),
179 Token::TokenOpConcat(_) => write!(f, ".."),
180 Token::TokenDummyOpConcat => write!(f, ".."),
181 Token::TokenOpAdd(_) => write!(f, "+"),
182 Token::TokenOpSub(_) => write!(f, "-"),
183 Token::TokenOpMul(_) => write!(f, "*"),
184 Token::TokenOpDiv(_) => write!(f, "/"),
185 Token::TokenOpMod(_) => write!(f, "%"),
186 Token::TokenOpQ(_) => write!(f, "?"),
187 Token::TokenOpColon(_) => write!(f, ":"),
188 }
189 }
190}
191
192pub trait ReadTokenRange {
193 fn range(&self) -> TokenRange;
194}
195
196impl ReadTokenRange for Token {
197 fn range(&self) -> TokenRange {
198 match self {
199 Token::Void => TokenRange::default(),
200 Token::TokenPrimNumberInt(_, r) => r.clone(),
201 Token::TokenPrimNumberFloat(_, r) => r.clone(),
202 Token::TokenPrimString(_, r) => r.clone(),
203 Token::TokenPrimBoolean(_, r) => r.clone(),
204 Token::TokenPrimNull(r) => r.clone(),
205 Token::TokenFnCall(_, _, r) => r.clone(),
206 Token::TokenVar(_, r) => r.clone(),
207 Token::TokenComment(_, r) => r.clone(),
208 Token::TokenRefVarSibling(_, r) => r.clone(),
209 Token::TokenRefVarUncle(_, r) => r.clone(),
210 Token::TokenRefVarRoot(_, r) => r.clone(),
211 Token::TokenFrameRoot(_, _, r) => r.clone(),
212 Token::TokenFrameDict(_, r) => r.clone(),
213 Token::TokenFrameList(_, r) => r.clone(),
214 Token::TokenExprSequence(_, r) => r.clone(),
215 Token::TokenFrameExprGroup(_, r) => r.clone(),
216 Token::TokenOpPipe(r) => r.clone(),
217 Token::TokenOpEq(r) => r.clone(),
218 Token::TokenOpNe(r) => r.clone(),
219 Token::TokenOpLe(r) => r.clone(),
220 Token::TokenOpGe(r) => r.clone(),
221 Token::TokenOpAnd(r) => r.clone(),
222 Token::TokenOpOr(r) => r.clone(),
223 Token::TokenOpNot(r) => r.clone(),
224 Token::TokenOpGt(r) => r.clone(),
225 Token::TokenOpLt(r) => r.clone(),
226 Token::TokenOpConcat(r) => r.clone(),
227 Token::TokenDummyOpConcat => TokenRange::default(),
228 Token::TokenOpAdd(r) => r.clone(),
229 Token::TokenOpSub(r) => r.clone(),
230 Token::TokenOpMul(r) => r.clone(),
231 Token::TokenOpDiv(r) => r.clone(),
232 Token::TokenOpMod(r) => r.clone(),
233 Token::TokenOpQ(r) => r.clone(),
234 Token::TokenOpColon(r) => r.clone(),
235 }
236 }
237}
238
239impl ReadTokenRange for TokenDec {
240 fn range(&self) -> TokenRange {
241 self.2.clone()
242 }
243}
244
245impl ReadTokenRange for TokenKey {
246 fn range(&self) -> TokenRange {
247 match self {
248 TokenKey::Dummy => TokenRange::default(),
249 TokenKey::DummySn(_) => TokenRange::default(),
250 TokenKey::Sn(_, r) => r.clone(),
251 TokenKey::String(_, r) => r.clone(),
252 }
253 }
254}
255
256impl ReadTokenRange for TokenId {
257 fn range(&self) -> TokenRange {
258 self.1.clone()
259 }
260}
261
262#[cfg(test)]
263mod tests {
264 use crate::TokenDec;
265
266 #[test]
267 fn test_read_token_range() {
268 use crate::token::TokenPosition;
269 use crate::token::{ReadTokenRange, Token, TokenId, TokenKey, TokenRange};
270 fn random_token_range() -> TokenRange {
271 let i = rand::random::<u8>();
272 let m = rand::random::<u16>();
273 let j = rand::random::<u8>();
274 let n = rand::random::<u16>();
275
276 TokenRange(
277 TokenPosition {
278 line: i as u32,
279 column: m as usize,
280 },
281 TokenPosition {
282 line: (i as u32) + (j as u32),
283 column: n as usize,
284 },
285 )
286 }
287
288 let r = random_token_range();
289 let t = Token::TokenPrimNumberInt(1, r.clone());
290 assert_eq!(t.range(), r);
291
292 let r = random_token_range();
293 let t = Token::TokenPrimString("hello".to_string(), r.clone());
294 assert_eq!(t.range(), r);
295
296 let r = random_token_range();
297 let t = Token::TokenRefVarSibling(vec![TokenKey::Dummy], r.clone());
298 assert_eq!(t.range(), r);
299
300 let r = random_token_range();
301 let k = TokenKey::String("hello".to_string(), r.clone());
302 assert_eq!(k.range(), r);
303
304 let k = TokenKey::Dummy;
305 assert_eq!(k.range(), TokenRange::default());
306
307 let r = random_token_range();
308 let i = TokenId("hello".to_string(), r.clone());
309 assert_eq!(i.range(), r);
310
311 let r = random_token_range();
312 let d = TokenDec(i, vec![], r.clone());
313 assert_eq!(d.range(), r);
314 }
315}