1#[macro_use]
2use crate::*;
3use crate::structures::tuple;
4
5#[cfg(not(feature = "no-std"))] use core::fmt;
6#[cfg(feature = "no-std")] use alloc::fmt;
7#[cfg(feature = "no-std")] use alloc::string::String;
8#[cfg(feature = "no-std")] use alloc::vec::Vec;
9use nom::{
10 IResult,
11 branch::alt,
12 sequence::tuple as nom_tuple,
13 combinator::{opt, eof},
14 multi::{many1, many_till, many0, separated_list1,separated_list0},
15 Err,
16 Err::Failure
17};
18
19use std::collections::HashMap;
20use colored::*;
21
22use crate::*;
23
24pub fn expression(input: ParseString) -> ParseResult<Expression> {
46 let (input, expr) = match range_expression(input.clone()) {
47 Ok((input, rng)) => (input, Expression::Range(Box::new(rng))),
48 Err(_) => match formula(input.clone()) {
49 Ok((input, Factor::Expression(expr))) => (input, *expr),
50 Ok((input, fctr)) => (input, Expression::Formula(fctr)),
51 Err(err) => {return Err(err);},
52 }
53 };
54 Ok((input, expr))
55}
56
57pub fn formula(input: ParseString) -> ParseResult<Factor> {
59 let (input, factor) = l1(input)?;
60 Ok((input, factor))
61}
62
63pub fn l1(input: ParseString) -> ParseResult<Factor> {
65 let (input, lhs) = l2(input)?;
66 let (input, rhs) = many0(nom_tuple((add_sub_operator,l2)))(input)?;
67 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
68 Ok((input, factor))
69}
70
71pub fn l2(input: ParseString) -> ParseResult<Factor> {
73 let (input, lhs) = l3(input)?;
74 let (input, rhs) = many0(nom_tuple((alt((mul_div_operator, matrix_operator)),l3)))(input)?;
75 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
76 Ok((input, factor))
77}
78
79pub fn l3(input: ParseString) -> ParseResult<Factor> {
81 let (input, lhs) = l4(input)?;
82 let (input, rhs) = many0(nom_tuple((exponent_operator,l4)))(input)?;
83 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
84 Ok((input, factor))
85}
86
87pub fn l4(input: ParseString) -> ParseResult<Factor> {
89 let (input, lhs) = l5(input)?;
90 let (input, rhs) = many0(nom_tuple((logic_operator,l5)))(input)?;
91 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
92 Ok((input, factor))
93}
94
95pub fn l5(input: ParseString) -> ParseResult<Factor> {
97 let (input, lhs) = l6(input)?;
98 let (input, rhs) = many0(nom_tuple((comparison_operator,l6)))(input)?;
99 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
100 Ok((input, factor))
101}
102
103pub fn l6(input: ParseString) -> ParseResult<Factor> {
105 let (input, lhs) = l7(input)?;
106 let (input, rhs) = many0(nom_tuple((table_operator,l7)))(input)?;
107 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
108 Ok((input, factor))
109}
110
111pub fn l7(input: ParseString) -> ParseResult<Factor> {
113 let (input, lhs) = factor(input)?;
114 let (input, rhs) = many0(nom_tuple((set_operator,factor)))(input)?;
115 let factor = if rhs.is_empty() { lhs } else { Factor::Term(Box::new(Term { lhs, rhs })) };
116 Ok((input, factor))
117}
118
119pub fn factor(input: ParseString) -> ParseResult<Factor> {
121 let (input, fctr) = match parenthetical_term(input.clone()) {
122 Ok((input, term)) => (input, term),
123 Err(_) => match negate_factor(input.clone()) {
124 Ok((input, neg)) => (input, neg),
125 Err(_) => match not_factor(input.clone()) {
126 Ok((input, neg)) => (input, neg),
127 Err(_) => match structure(input.clone()) {
128 Ok((input, strct)) => (input, Factor::Expression(Box::new(Expression::Structure(strct)))),
129 Err(_) => match function_call(input.clone()) {
130 Ok((input, fxn)) => (input, Factor::Expression(Box::new(Expression::FunctionCall(fxn)))),
131 Err(_) => match literal(input.clone()) {
132 Ok((input, ltrl)) => (input, Factor::Expression(Box::new(Expression::Literal(ltrl)))),
133 Err(_) => match slice(input.clone()) {
134 Ok((input, slc)) => (input, Factor::Expression(Box::new(Expression::Slice(slc)))),
135 Err(_) => match var(input.clone()) {
136 Ok((input, var)) => (input, Factor::Expression(Box::new(Expression::Var(var)))),
137 Err(err) => { return Err(err); },
138 },
139 },
140 },
141 },
142 },
143 },
144 },
145 };
146 let (input, transpose) = opt(transpose)(input)?;
147 let fctr = match transpose {
148 Some(_) => Factor::Transpose(Box::new(fctr)),
149 None => fctr,
150 };
151 Ok((input, fctr))
152}
153
154pub fn parenthetical_term(input: ParseString) -> ParseResult<Factor> {
156 let msg1 = "Expects expression";
157 let msg2 = "Expects right parenthesis ')'";
158 let (input, (_, r)) = range(left_parenthesis)(input)?;
159 let (input, frmla) = label!(formula, msg1)(input)?;
160 let (input, _) = label!(right_parenthesis, msg2, r)(input)?;
161 Ok((input, Factor::Parenthetical(Box::new(frmla))))
162}
163
164pub fn var(input: ParseString) -> ParseResult<Var> {
166 let ((input, name)) = identifier(input)?;
167 let ((input, kind)) = opt(kind_annotation)(input)?;
168 Ok((input, Var{ name, kind }))
169}
170
171pub fn statement_separator(input: ParseString) -> ParseResult<()> {
173 let (input,_) = nom_tuple((whitespace0,semicolon,whitespace0))(input)?;
174 Ok((input, ()))
175}
176
177pub fn add_sub_operator(input: ParseString) -> ParseResult<FormulaOperator> {
182 let (input, op) = alt((add, subtract))(input)?;
183 Ok((input, FormulaOperator::AddSub(op)))
184}
185
186
187pub fn mul_div_operator(input: ParseString) -> ParseResult<FormulaOperator> {
189 let (input, op) = alt((multiply, divide, modulus))(input)?;
190 Ok((input, FormulaOperator::MulDiv(op)))
191}
192
193pub fn exponent_operator(input: ParseString) -> ParseResult<FormulaOperator> {
195 let (input, op) = exponent(input)?;
196 Ok((input, FormulaOperator::Exponent(op)))
197}
198
199pub fn negate_factor(input: ParseString) -> ParseResult<Factor> {
201 let (input, _) = dash(input)?;
202 let (input, expr) = factor(input)?;
203 Ok((input, Factor::Negate(Box::new(expr))))
204}
205
206pub fn not_factor(input: ParseString) -> ParseResult<Factor> {
208 let (input, _) = not(input)?;
209 let (input, expr) = factor(input)?;
210 Ok((input, Factor::Not(Box::new(expr))))
211}
212
213pub fn add(input: ParseString) -> ParseResult<AddSubOp> {
215 let (input, _) = ws1e(input)?;
216 let (input, _) = tag("+")(input)?;
217 let (input, _) = ws1e(input)?;
218 Ok((input, AddSubOp::Add))
219}
220
221pub fn subtract(input: ParseString) -> ParseResult<AddSubOp> {
223 let (input, _) = ws1e(input)?;
224 let (input, _) = tag("-")(input)?;
225 let (input, _) = ws1e(input)?;
226 Ok((input, AddSubOp::Sub))
227}
228
229pub fn multiply(input: ParseString) -> ParseResult<MulDivOp> {
231 let (input, _) = ws1e(input)?;
232 let (input, _) = alt((tag("*"), tag("×")))(input)?;
233 let (input, _) = ws1e(input)?;
234 Ok((input, MulDivOp::Mul))
235}
236
237pub fn divide(input: ParseString) -> ParseResult<MulDivOp> {
239 let (input, _) = ws1e(input)?;
240 let (input, _) = alt((tag("/"),tag("÷")))(input)?;
241 let (input, _) = ws1e(input)?;
242 Ok((input, MulDivOp::Div))
243}
244
245pub fn modulus(input: ParseString) -> ParseResult<MulDivOp> {
247 let (input, _) = ws1e(input)?;
248 let (input, _) = tag("%")(input)?;
249 let (input, _) = ws1e(input)?;
250 Ok((input, MulDivOp::Mod))
251}
252
253pub fn exponent(input: ParseString) -> ParseResult<ExponentOp> {
255 let (input, _) = ws1e(input)?;
256 let (input, _) = tag("^")(input)?;
257 let (input, _) = ws1e(input)?;
258 Ok((input, ExponentOp::Exp))
259}
260
261pub fn matrix_operator(input: ParseString) -> ParseResult<FormulaOperator> {
266 let (input, op) = alt((matrix_multiply, matrix_solve, dot_product, cross_product))(input)?;
267 Ok((input, FormulaOperator::Vec(op)))
268}
269
270pub fn matrix_multiply(input: ParseString) -> ParseResult<VecOp> {
272 let (input, _) = ws1e(input)?;
273 let (input, _) = tag("**")(input)?;
274 let (input, _) = ws1e(input)?;
275 Ok((input, VecOp::MatMul))
276}
277
278pub fn matrix_solve(input: ParseString) -> ParseResult<VecOp> {
280 let (input, _) = ws1e(input)?;
281 let (input, _) = tag("\\")(input)?;
282 let (input, _) = ws1e(input)?;
283 Ok((input, VecOp::Solve))
284}
285
286pub fn dot_product(input: ParseString) -> ParseResult<VecOp> {
288 let (input, _) = ws1e(input)?;
289 let (input, _) = alt((tag("·"),tag("•")))(input)?;
290 let (input, _) = ws1e(input)?;
291 Ok((input, VecOp::Dot))
292}
293
294pub fn cross_product(input: ParseString) -> ParseResult<VecOp> {
296 let (input, _) = ws1e(input)?;
297 let (input, _) = tag("⨯")(input)?;
298 let (input, _) = ws1e(input)?;
299 Ok((input, VecOp::Cross))
300}
301
302pub fn transpose(input: ParseString) -> ParseResult<()> {
304 let (input, _) = tag("'")(input)?;
305 Ok((input, ()))
306}
307
308pub fn range_expression(input: ParseString) -> ParseResult<RangeExpression> {
313 let (input, start) = formula(input)?;
314 let (input, op) = range_operator(input)?;
315 let (input, x) = formula(input)?;
316 let (input, y) = opt(nom_tuple((range_operator,formula)))(input)?;
317 let range = match y {
318 Some((op2,terminal)) => RangeExpression{start, increment: Some((op,x)), operator: op2, terminal},
319 None => RangeExpression{start, increment: None, operator: op, terminal: x},
320 };
321 Ok((input, range))
322}
323
324pub fn range_inclusive(input: ParseString) -> ParseResult<RangeOp> {
326 let (input, _) = tag("..=")(input)?;
327 Ok((input, RangeOp::Inclusive))
328}
329
330pub fn range_exclusive(input: ParseString) -> ParseResult<RangeOp> {
332 let (input, _) = tag("..")(input)?;
333 Ok((input, RangeOp::Exclusive))
334}
335
336pub fn range_operator(input: ParseString) -> ParseResult<RangeOp> {
338 let (input, op) = alt((range_inclusive,range_exclusive))(input)?;
339 Ok((input, op))
340}
341
342pub fn comparison_operator(input: ParseString) -> ParseResult<FormulaOperator> {
347 let (input, op) = alt((strict_equal, strict_not_equal, not_equal, equal_to, greater_than_equal, greater_than, less_than_equal, less_than))(input)?;
348 Ok((input, FormulaOperator::Comparison(op)))
349}
350
351pub fn not_equal(input: ParseString) -> ParseResult<ComparisonOp> {
353 let (input, _) = ws1e(input)?;
354 let (input, _) = alt((tag("!="),tag("¬="),tag("≠")))(input)?;
355 let (input, _) = ws1e(input)?;
356 Ok((input, ComparisonOp::NotEqual))
357}
358
359pub fn equal_to(input: ParseString) -> ParseResult<ComparisonOp> {
361 let (input, _) = ws1e(input)?;
362 let (input, _) = tag("==")(input)?;
363 let (input, _) = ws1e(input)?;
364 Ok((input, ComparisonOp::Equal))
365}
366
367pub fn strict_not_equal(input: ParseString) -> ParseResult<ComparisonOp> {
369 let (input, _) = ws1e(input)?;
370 let (input, _) = alt((tag("=!="),tag("=¬=")))(input)?;
371 let (input, _) = ws1e(input)?;
372 Ok((input, ComparisonOp::StrictNotEqual))
373}
374
375pub fn strict_equal(input: ParseString) -> ParseResult<ComparisonOp> {
377 let (input, _) = ws1e(input)?;
378 let (input, _) = alt((tag("=:="),tag("≡")))(input)?;
379 let (input, _) = ws1e(input)?;
380 Ok((input, ComparisonOp::StrictEqual))
381}
382
383pub fn greater_than(input: ParseString) -> ParseResult<ComparisonOp> {
385 let (input, _) = ws1e(input)?;
386 let (input, _) = tag(">")(input)?;
387 let (input, _) = ws1e(input)?;
388 Ok((input, ComparisonOp::GreaterThan))
389}
390
391pub fn less_than(input: ParseString) -> ParseResult<ComparisonOp> {
393 let (input, _) = ws1e(input)?;
394 let (input, _) = tag("<")(input)?;
395 let (input, _) = ws1e(input)?;
396 Ok((input, ComparisonOp::LessThan))
397}
398
399pub fn greater_than_equal(input: ParseString) -> ParseResult<ComparisonOp> {
401 let (input, _) = ws1e(input)?;
402 let (input, _) = alt((tag(">="),tag("≥")))(input)?;
403 let (input, _) = ws1e(input)?;
404 Ok((input, ComparisonOp::GreaterThanEqual))
405}
406
407pub fn less_than_equal(input: ParseString) -> ParseResult<ComparisonOp> {
409 let (input, _) = ws1e(input)?;
410 let (input, _) = alt((tag("<="),tag("≤")))(input)?;
411 let (input, _) = ws1e(input)?;
412 Ok((input, ComparisonOp::LessThanEqual))
413}
414
415pub fn logic_operator(input: ParseString) -> ParseResult<FormulaOperator> {
420 let (input, op) = alt((and, or, xor))(input)?;
421 Ok((input, FormulaOperator::Logic(op)))
422}
423
424pub fn or(input: ParseString) -> ParseResult<LogicOp> {
426 let (input, _) = ws1e(input)?;
427 let (input, _) = alt((tag("||"), tag("∨"), tag("⋁")))(input)?;
428 let (input, _) = ws1e(input)?;
429 Ok((input, LogicOp::Or))
430}
431
432pub fn and(input: ParseString) -> ParseResult<LogicOp> {
434 let (input, _) = ws1e(input)?;
435 let (input, _) = alt((tag("&&"), tag("∧"), tag("⋀")))(input)?;
436 let (input, _) = ws1e(input)?;
437 Ok((input, LogicOp::And))
438}
439
440pub fn not(input: ParseString) -> ParseResult<LogicOp> {
442 let (input, _) = alt((tag("!"), tag("¬")))(input)?;
443 Ok((input, LogicOp::Not))
444}
445
446pub fn xor(input: ParseString) -> ParseResult<LogicOp> {
448 let (input, _) = ws1e(input)?;
449 let (input, _) = alt((tag("^^"), tag("⊕"), tag("⊻")))(input)?;
450 let (input, _) = ws1e(input)?;
451 Ok((input, LogicOp::Xor))
452}
453
454fn table_operator(input: ParseString) -> ParseResult<FormulaOperator> {
459 let (input, op) = alt((join,left_join,right_join,full_join,left_semi_join,left_anti_join))(input)?;
460 Ok((input, FormulaOperator::Table(op)))
461}
462
463fn join(input: ParseString) -> ParseResult<TableOp> {
465 let (input, _) = ws1e(input)?;
466 let (input, _) = tag("⋈")(input)?;
467 let (input, _) = ws1e(input)?;
468 Ok((input, TableOp::InnerJoin))
469}
470
471fn left_join(input: ParseString) -> ParseResult<TableOp> {
473 let (input, _) = ws1e(input)?;
474 let (input, _) = tag("⟕")(input)?;
475 let (input, _) = ws1e(input)?;
476 Ok((input, TableOp::LeftOuterJoin))
477}
478
479fn right_join(input: ParseString) -> ParseResult<TableOp> {
481 let (input, _) = ws1e(input)?;
482 let (input, _) = tag("⟖")(input)?;
483 let (input, _) = ws1e(input)?;
484 Ok((input, TableOp::RightOuterJoin))
485}
486
487fn full_join(input: ParseString) -> ParseResult<TableOp> {
489 let (input, _) = ws1e(input)?;
490 let (input, _) = tag("⟗")(input)?;
491 let (input, _) = ws1e(input)?;
492 Ok((input, TableOp::FullOuterJoin))
493}
494
495fn left_semi_join(input: ParseString) -> ParseResult<TableOp> {
497 let (input, _) = ws1e(input)?;
498 let (input, _) = tag("⋉")(input)?;
499 let (input, _) = ws1e(input)?;
500 Ok((input, TableOp::LeftSemiJoin))
501}
502
503fn left_anti_join(input: ParseString) -> ParseResult<TableOp> {
505 let (input, _) = ws1e(input)?;
506 let (input, _) = tag("▷")(input)?;
507 let (input, _) = ws1e(input)?;
508 Ok((input, TableOp::LeftAntiJoin))
509}
510
511
512pub fn set_operator(input: ParseString) -> ParseResult<FormulaOperator> {
517 let (input, op) = alt((union_op,intersection,difference,complement,subset,superset,proper_subset,proper_superset,element_of,not_element_of))(input)?;
518 Ok((input, FormulaOperator::Set(op)))
519}
520
521pub fn union_op(input: ParseString) -> ParseResult<SetOp> {
523 let (input, _) = ws1e(input)?;
524 let (input, _) = tag("∪")(input)?;
525 let (input, _) = ws1e(input)?;
526 Ok((input, SetOp::Union))
527}
528
529pub fn intersection(input: ParseString) -> ParseResult<SetOp> {
531 let (input, _) = ws1e(input)?;
532 let (input, _) = tag("∩")(input)?;
533 let (input, _) = ws1e(input)?;
534 Ok((input, SetOp::Intersection))
535}
536
537pub fn difference(input: ParseString) -> ParseResult<SetOp> {
539 let (input, _) = ws1e(input)?;
540 let (input, _) = tag("∖")(input)?;
541 let (input, _) = ws1e(input)?;
542 Ok((input, SetOp::Difference))
543}
544
545pub fn complement(input: ParseString) -> ParseResult<SetOp> {
547 let (input, _) = ws1e(input)?;
548 let (input, _) = tag("∁")(input)?;
549 let (input, _) = ws1e(input)?;
550 Ok((input, SetOp::Complement))
551}
552
553pub fn subset(input: ParseString) -> ParseResult<SetOp> {
555 let (input, _) = ws1e(input)?;
556 let (input, _) = tag("⊆")(input)?;
557 let (input, _) = ws1e(input)?;
558 Ok((input, SetOp::Subset))
559}
560
561pub fn superset(input: ParseString) -> ParseResult<SetOp> {
563 let (input, _) = ws1e(input)?;
564 let (input, _) = tag("⊇")(input)?;
565 let (input, _) = ws1e(input)?;
566 Ok((input, SetOp::Superset))
567}
568
569pub fn proper_subset(input: ParseString) -> ParseResult<SetOp> {
571 let (input, _) = ws1e(input)?;
572 let (input, _) = alt((tag("⊊"), tag("⊂")))(input)?;
573 let (input, _) = ws1e(input)?;
574 Ok((input, SetOp::ProperSubset))
575}
576
577pub fn proper_superset(input: ParseString) -> ParseResult<SetOp> {
579 let (input, _) = ws1e(input)?;
580 let (input, _) = alt((tag("⊋"), tag("⊃")))(input)?;
581 let (input, _) = ws1e(input)?;
582 Ok((input, SetOp::ProperSuperset))
583}
584
585pub fn element_of(input: ParseString) -> ParseResult<SetOp> {
587 let (input, _) = ws1e(input)?;
588 let (input, _) = tag("∈")(input)?;
589 let (input, _) = ws1e(input)?;
590 Ok((input, SetOp::ElementOf))
591}
592
593pub fn not_element_of(input: ParseString) -> ParseResult<SetOp> {
595 let (input, _) = ws1e(input)?;
596 let (input, _) = tag("∉")(input)?;
597 let (input, _) = ws1e(input)?;
598 Ok((input, SetOp::NotElementOf))
599}
600
601pub fn subscript(input: ParseString) -> ParseResult<Vec<Subscript>> {
606 let (input, subscripts) = many1(alt((swizzle_subscript,dot_subscript,dot_subscript_int,bracket_subscript,brace_subscript)))(input)?;
607 Ok((input, subscripts))
608}
609
610pub fn slice(input: ParseString) -> ParseResult<Slice> {
612 let (input, name) = identifier(input)?;
613 let (input, ixes) = subscript(input)?;
614 Ok((input, Slice{name, subscript: ixes}))
615}
616
617pub fn slice_ref(input: ParseString) -> ParseResult<SliceRef> {
619 let (input, name) = identifier(input)?;
620 let (input, ixes) = opt(subscript)(input)?;
621 Ok((input, SliceRef{name, subscript: ixes}))
622}
623
624pub fn swizzle_subscript(input: ParseString) -> ParseResult<Subscript> {
626 let (input, _) = period(input)?;
627 let (input, first) = identifier(input)?;
628 let (input, _) = comma(input)?;
629 let (input, mut name) = separated_list1(tag(","),identifier)(input)?;
630 let mut subscripts = vec![first];
631 subscripts.append(&mut name);
632 Ok((input, Subscript::Swizzle(subscripts)))
633}
634
635pub fn dot_subscript(input: ParseString) -> ParseResult<Subscript> {
637 let (input, _) = period(input)?;
638 let (input, name) = identifier(input)?;
639 Ok((input, Subscript::Dot(name)))
640}
641
642pub fn dot_subscript_int(input: ParseString) -> ParseResult<Subscript> {
644 let (input, _) = period(input)?;
645 let (input, name) = integer_literal(input)?;
646 Ok((input, Subscript::DotInt(name)))
647}
648
649pub fn bracket_subscript(input: ParseString) -> ParseResult<Subscript> {
651 let (input, _) = left_bracket(input)?;
652 let (input, subscripts) = separated_list1(list_separator,alt((select_all,range_subscript,formula_subscript)))(input)?;
653 let (input, _) = right_bracket(input)?;
654 Ok((input, Subscript::Bracket(subscripts)))
655}
656
657pub fn brace_subscript(input: ParseString) -> ParseResult<Subscript> {
659 let (input, _) = left_brace(input)?;
660 let (input, subscripts) = separated_list1(list_separator,alt((select_all,range_subscript,formula_subscript)))(input)?;
661 let (input, _) = right_brace(input)?;
662 Ok((input, Subscript::Brace(subscripts)))
663}
664
665pub fn select_all(input: ParseString) -> ParseResult<Subscript> {
667 let (input, lhs) = colon(input)?;
668 Ok((input, Subscript::All))
669}
670
671pub fn formula_subscript(input: ParseString) -> ParseResult<Subscript> {
673 let (input, factor) = formula(input)?;
674 Ok((input, Subscript::Formula(factor)))
675}
676
677pub fn range_subscript(input: ParseString) -> ParseResult<Subscript> {
679 let (input, rng) = range_expression(input)?;
680 Ok((input, Subscript::Range(rng)))
681}