1use nom::*;
2use std::iter::Enumerate;
3use std::ops::{Range, RangeFrom, RangeFull, RangeTo};
4use std::fmt;
5
6#[derive(Debug, Clone)]
7pub enum Token {
8 Integer(i64),
10 Float(f64),
11 Boolean(bool),
12 Text(String),
13 Null,
15 Div,
16 Value,
17 Ref,
18 Name,
19 Num,
20 NA,
21 GettingData,
22 MultiSheet(String),
24 Sheet(String),
25 Range(String),
26 Cell(String),
27 VRange(String),
28 HRange(String),
29 Plus,
31 Minus,
32 Divide,
33 Multiply,
34 Exponent,
35 Ampersand,
36 Equal,
37 Exclamation,
38 Comma,
39 Period,
40 Colon,
41 SemiColon,
42 LAngle,
43 RAngle,
44 LParen,
45 RParen,
46 LBrace,
47 RBrace,
48 LBracket,
49 RBracket,
50 Ident(String),
51 EOF
52}
53
54impl PartialEq for Token {
55 fn eq(&self, other: &Self) -> bool {
56 self.to_string() == other.to_string()
57 }
58}
59
60impl Eq for Token { }
61
62impl fmt::Display for Token {
63 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
64 match self {
65 Token::Integer(i) => write!(f, "{}", i),
66 Token::Float(x) => write!(f, "{}", x),
67 Token::Boolean(b) => {
68 if *b {
69 write!(f, "TRUE")
70 } else {
71 write!(f, "FALSE")
72 }
73 },
74 Token::Text(s) => write!(f, "{}", s),
75 Token::MultiSheet(s) => write!(f, "{}", s),
76 Token::Sheet(s) => write!(f, "{}", s),
77 Token::Range(s) => write!(f, "{}", s),
78 Token::Cell(s) => write!(f, "{}", s),
79 Token::VRange(s) => write!(f, "{}", s),
80 Token::HRange(s) => write!(f, "{}", s),
81 Token::Ident(s) => write!(f, "{}", s),
82 Token::Null => write!(f, "#NULL!"),
83 Token::Div => write!(f, "#DIV/0!"),
84 Token::Value => write!(f, "#VALUE!"),
85 Token::Ref => write!(f, "#REF!"),
86 Token::Name => write!(f, "#NAME!"),
87 Token::Num => write!(f, "#NUM!"),
88 Token::NA => write!(f, "#N/A!"),
89 Token::GettingData => write!(f, "#GETTING_DATA"),
90 Token::Plus => write!(f, "+"),
91 Token::Minus => write!(f, "-"),
92 Token::Divide => write!(f, "/"),
93 Token::Multiply => write!(f, "*"),
94 Token::Exponent => write!(f, "^"),
95 Token::Ampersand => write!(f, "&"),
96 Token::Equal => write!(f, "="),
97 Token::Exclamation => write!(f, "!"),
98 Token::Comma => write!(f, ","),
99 Token::Period => write!(f, "."),
100 Token::Colon => write!(f, ":"),
101 Token::SemiColon => write!(f, ";"),
102 Token::LAngle => write!(f, "<"),
103 Token::RAngle => write!(f, ">"),
104 Token::LParen => write!(f, "("),
105 Token::RParen => write!(f, ")"),
106 Token::LBrace => write!(f, "{{"),
107 Token::RBrace => write!(f, "}}"),
108 Token::LBracket => write!(f, "["),
109 Token::RBracket => write!(f, "]"),
110 Token::EOF => write!(f, ""),
111 }
112 }
113}
114
115#[derive(Clone, Copy, PartialEq, Eq, Debug)]
116pub struct Tokens<'a> {
117 pub tok: &'a [Token],
118 pub start: usize,
119 pub end: usize,
120}
121
122impl<'a> Tokens<'a> {
123 pub fn new(vec: &'a [Token]) -> Self {
124 Tokens {
125 tok: vec,
126 start: 0,
127 end: vec.len(),
128 }
129 }
130}
131
132impl<'a> InputLength for Tokens<'a> {
133 fn input_len(&self) -> usize {
134 self.tok.len()
135 }
136}
137
138impl<'a> InputTake for Tokens<'a> {
139 fn take(&self, count: usize) -> Self {
140 Tokens {
141 tok: &self.tok[0..count],
142 start: 0,
143 end: count,
144 }
145 }
146
147 fn take_split(&self, count: usize) -> (Self, Self) {
148 let (prefix, suffix) = self.tok.split_at(count);
149 let first = Tokens {
150 tok: prefix,
151 start: 0,
152 end: prefix.len(),
153 };
154 let second = Tokens {
155 tok: suffix,
156 start: 0,
157 end: suffix.len(),
158 };
159 (second, first)
160 }
161}
162
163impl InputLength for Token {
164 fn input_len(&self) -> usize {
165 1
166 }
167}
168
169impl<'a> Slice<Range<usize>> for Tokens<'a> {
170 fn slice(&self, range: Range<usize>) -> Self {
171 Tokens {
172 tok: self.tok.slice(range.clone()),
173 start: self.start + range.start,
174 end: self.start + range.end,
175 }
176 }
177}
178
179impl<'a> Slice<RangeTo<usize>> for Tokens<'a> {
180 fn slice(&self, range: RangeTo<usize>) -> Self {
181 self.slice(0..range.end)
182 }
183}
184
185impl<'a> Slice<RangeFrom<usize>> for Tokens<'a> {
186 #[inline]
187 fn slice(&self, range: RangeFrom<usize>) -> Self {
188 self.slice(range.start..self.end - self.start)
189 }
190}
191
192impl<'a> Slice<RangeFull> for Tokens<'a> {
193 #[inline]
194 fn slice(&self, _: RangeFull) -> Self {
195 Tokens {
196 tok: self.tok,
197 start: self.start,
198 end: self.end,
199 }
200 }
201}
202
203impl<'a> InputIter for Tokens<'a> {
204 type Item = &'a Token;
205 type Iter = Enumerate<::std::slice::Iter<'a, Token>>;
206 type IterElem = ::std::slice::Iter<'a, Token>;
207
208 #[inline]
209 fn iter_indices(&self) -> Enumerate<::std::slice::Iter<'a, Token>> {
210 self.tok.iter().enumerate()
211 }
212 #[inline]
213 fn iter_elements(&self) -> ::std::slice::Iter<'a, Token> {
214 self.tok.iter()
215 }
216 #[inline]
217 fn position<P>(&self, predicate: P) -> Option<usize>
218 where
219 P: Fn(Self::Item) -> bool,
220 {
221 self.tok.iter().position(predicate)
222 }
223 #[inline]
224 fn slice_index(&self, count: usize) -> Result<usize, Needed> {
225 if self.tok.len() >= count {
226 Ok(count)
227 } else {
228 Err(Needed::Unknown)
229 }
230 }
231}
232
233impl<'a> UnspecializedInput for Tokens<'a> { }