|
33 | 33 | arg_count: Vec<i32>,
|
34 | 34 | }
|
35 | 35 |
|
| 36 | +pub(crate) const ID_ARRAY_ACCESS: u32 = u32::MAX; |
| 37 | +pub(crate) const ID_ARRAY_BUILD: u32 = u32::MAX - 1; |
| 38 | +pub(crate) const ID_EXTERNAL: u32 = u32::MAX - 2; |
| 39 | + |
36 | 40 | impl<'x, F> ExpressionParser<'x, F>
|
37 | 41 | where
|
38 | 42 | F: Fn(&str, bool) -> Result<Token, String>,
|
@@ -106,13 +110,13 @@ where
|
106 | 110 | });
|
107 | 111 | }
|
108 | 112 |
|
109 |
| - let expr = if *id != u32::MAX { |
110 |
| - Expression::Function { |
111 |
| - id: *id, |
| 113 | + let expr = match *id { |
| 114 | + ID_ARRAY_ACCESS => Expression::ArrayAccess, |
| 115 | + ID_ARRAY_BUILD => Expression::ArrayBuild(*num_args), |
| 116 | + id => Expression::Function { |
| 117 | + id, |
112 | 118 | num_args: *num_args,
|
113 |
| - } |
114 |
| - } else { |
115 |
| - Expression::ArrayAccess |
| 119 | + }, |
116 | 120 | };
|
117 | 121 |
|
118 | 122 | self.operator_stack.pop();
|
@@ -168,50 +172,23 @@ where
|
168 | 172 | .push((Token::Function { id, name, num_args }, None))
|
169 | 173 | }
|
170 | 174 | Token::OpenBracket => {
|
171 |
| - if last_is_var_or_fnc { |
172 |
| - // Array access |
173 |
| - self.arg_count.push(1); |
174 |
| - self.operator_stack.push(( |
175 |
| - Token::Function { |
176 |
| - id: u32::MAX, |
177 |
| - name: "[".to_string(), |
178 |
| - num_args: 2, |
179 |
| - }, |
180 |
| - None, |
181 |
| - )); |
182 |
| - self.operator_stack.push((token, None)) |
| 175 | + // Array functions |
| 176 | + let (id, num_args, arg_count) = if last_is_var_or_fnc { |
| 177 | + (ID_ARRAY_ACCESS, 2, 1) |
183 | 178 | } else {
|
184 |
| - // Array literal |
185 |
| - let mut array = Vec::new(); |
186 |
| - |
187 |
| - loop { |
188 |
| - match self.tokenizer.next()? { |
189 |
| - Some(Token::Number(n)) => array.push(n.into()), |
190 |
| - Some(Token::String(s)) => array.push(s.into()), |
191 |
| - Some(Token::CloseBracket) => break, |
192 |
| - _ => { |
193 |
| - return Err(format!( |
194 |
| - "Invalid token {:?} in array literal", |
195 |
| - token |
196 |
| - )) |
197 |
| - } |
198 |
| - } |
199 |
| - |
200 |
| - match self.tokenizer.next()? { |
201 |
| - Some(Token::Comma) => {} |
202 |
| - Some(Token::CloseBracket) => break, |
203 |
| - _ => { |
204 |
| - return Err(format!( |
205 |
| - "Invalid token {:?} in array literal", |
206 |
| - token |
207 |
| - )) |
208 |
| - } |
209 |
| - } |
210 |
| - } |
211 |
| - |
212 | 179 | self.inc_arg_count();
|
213 |
| - self.output.push(Expression::Constant(array.into())) |
214 |
| - } |
| 180 | + (ID_ARRAY_BUILD, 0, 0) |
| 181 | + }; |
| 182 | + self.arg_count.push(arg_count); |
| 183 | + self.operator_stack.push(( |
| 184 | + Token::Function { |
| 185 | + id, |
| 186 | + name: String::from("array"), |
| 187 | + num_args, |
| 188 | + }, |
| 189 | + None, |
| 190 | + )); |
| 191 | + self.operator_stack.push((token, None)); |
215 | 192 | }
|
216 | 193 | Token::Comma => {
|
217 | 194 | while let Some((token, jmp_pos)) = self.operator_stack.last() {
|
@@ -253,6 +230,13 @@ where
|
253 | 230 | fn inc_arg_count(&mut self) {
|
254 | 231 | if let Some(x) = self.arg_count.last_mut() {
|
255 | 232 | *x = x.saturating_add(1);
|
| 233 | + let op_pos = self.operator_stack.len() - 2; |
| 234 | + match self.operator_stack.get_mut(op_pos) { |
| 235 | + Some((Token::Function { num_args, id, .. }, _)) if *id == ID_ARRAY_BUILD => { |
| 236 | + *num_args += 1; |
| 237 | + } |
| 238 | + _ => {} |
| 239 | + } |
256 | 240 | }
|
257 | 241 | }
|
258 | 242 |
|
|
0 commit comments