Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,7 @@ criterion = {version="0.5.1", features=["html_reports"]}
[[bench]]
name = "execute_expression"
harness = false

[[bench]]
name = "display_expression"
harness = false
32 changes: 32 additions & 0 deletions benches/display_expression.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
use criterion::{criterion_group, criterion_main, Criterion, black_box};
use expression_engine::{parse_expression, ExprAST};

fn bench_display_expression(c: &mut Criterion) {
// A complex expression that involves Function, List, Map, and Stmt (chain)
let input = "
a = 1;
b = 2;
func_call(
[a, b, 3, 4],
{
'key1': a + b,
'key2': [1, 2, 3]
},
nested_func(a, b)
);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
";

// Parse it once to get the AST
let ast = parse_expression(input).expect("Failed to parse expression");

c.bench_function("display_expression", |b| {
b.iter(|| {
// Measure the time it takes to format the AST
format!("{}", black_box(&ast))
})
});
}

criterion_group!(benches, bench_display_expression);
criterion_main!(benches);
50 changes: 24 additions & 26 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ impl<'a> fmt::Display for Literal<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use Literal::*;
match self {
Number(value) => write!(f, "Number: {}", value.clone()),
Bool(value) => write!(f, "Bool: {}", value.clone()),
Number(value) => write!(f, "Number: {}", value),
Bool(value) => write!(f, "Bool: {}", value),
String(value) => write!(f, "String: {}", *value),
}
}
Expand All @@ -48,57 +48,55 @@ pub enum ExprAST<'a> {
impl<'a> fmt::Display for ExprAST<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Literal(val) => write!(f, "Literal AST: {}", val.clone()),
Self::Literal(val) => write!(f, "Literal AST: {}", val),
Self::Unary(op, rhs) => {
write!(f, "Unary AST: Op: {}, Rhs: {}", op, rhs.clone())
write!(f, "Unary AST: Op: {}, Rhs: {}", op, rhs)
}
Self::Binary(op, lhs, rhs) => write!(
f,
"Binary AST: Op: {}, Lhs: {}, Rhs: {}",
op,
lhs.clone(),
rhs.clone()
lhs,
rhs
),
Self::Postfix(lhs, op) => {
write!(f, "Postfix AST: Lhs: {}, Op: {}", lhs.clone(), op.clone(),)
write!(f, "Postfix AST: Lhs: {}, Op: {}", lhs, op,)
}
Self::Ternary(condition, lhs, rhs) => write!(
f,
"Ternary AST: Condition: {}, Lhs: {}, Rhs: {}",
condition.clone(),
lhs.clone(),
rhs.clone()
condition,
lhs,
rhs
),
Self::Reference(name) => write!(f, "Reference AST: reference: {}", name),
Self::Function(name, params) => {
let mut s = "[".to_string();
for param in params.into_iter() {
s.push_str(format!("{},", param.clone()).as_str());
write!(f, "Function AST: name: {}, params: [", name)?;
for param in params {
write!(f, "{},", param)?;
}
s.push(']');
write!(f, "Function AST: name: {}, params: {}", name, s)
write!(f, "]")
}
Self::List(params) => {
let mut s = "[".to_string();
for param in params.into_iter() {
s.push_str(format!("{},", param.clone()).as_str());
write!(f, "List AST: params: [")?;
for param in params {
write!(f, "{},", param)?;
}
s.push(']');
write!(f, "List AST: params: {}", s)
write!(f, "]")
}
Self::Map(m) => {
let mut s = String::new();
write!(f, "Map AST: ")?;
for (k, v) in m {
s.push_str(format!("({} {}), ", k.clone(), v.clone()).as_str());
write!(f, "({} {}), ", k, v)?;
}
write!(f, "Map AST: {}", s)
Ok(())
}
Self::Stmt(exprs) => {
let mut s = String::new();
write!(f, "Chain AST: ")?;
for expr in exprs {
s.push_str(format!("{};", expr.clone()).as_str());
write!(f, "{};", expr)?;
}
write!(f, "Chain AST: {}", s)
Ok(())
}
Self::None => write!(f, "None"),
}
Expand Down
Loading