1 mod parser;
2 mod parser_ast;
3 mod parser_lexer;
4 
5 use winnow::prelude::*;
6 
7 #[allow(clippy::eq_op, clippy::erasing_op)]
arithmetic(c: &mut criterion::Criterion)8 fn arithmetic(c: &mut criterion::Criterion) {
9     let data = "  2*2 / ( 5 - 1) + 3 / 4 * (2 - 7 + 567 *12 /2) + 3*(1+2*( 45 /2))";
10     let expected = 2 * 2 / (5 - 1) + 3 * (1 + 2 * (45 / 2));
11 
12     assert_eq!(parser::expr.parse(data), Ok(expected));
13     assert_eq!(
14         parser_ast::expr.parse(data).map(|ast| ast.eval()),
15         Ok(expected)
16     );
17     assert_eq!(
18         parser_lexer::expr2.parse(data).map(|ast| ast.eval()),
19         Ok(expected)
20     );
21     c.bench_function("direct", |b| {
22         b.iter(|| parser::expr.parse(data).unwrap());
23     });
24     c.bench_function("ast", |b| {
25         b.iter(|| parser_ast::expr.parse(data).unwrap().eval());
26     });
27     c.bench_function("lexer", |b| {
28         b.iter(|| parser_lexer::expr2.parse_peek(data).unwrap());
29     });
30 }
31 
32 criterion::criterion_group!(benches, arithmetic);
33 criterion::criterion_main!(benches);
34