diff --git a/core/expression/Cargo.toml b/core/expression/Cargo.toml
index 9a904122..32449b26 100644
--- a/core/expression/Cargo.toml
+++ b/core/expression/Cargo.toml
@@ -25,7 +25,10 @@ rust_decimal = { workspace = true, features = ["maths-nopanic"] }
rust_decimal_macros = { workspace = true }
[dev-dependencies]
+anyhow = { workspace = true }
criterion = { workspace = true }
+csv = "1.2.2"
+serde_json5 = "0.1.0"
[features]
default = ["regex-deprecated"]
diff --git a/core/expression/src/parser/standard/mod.rs b/core/expression/src/parser/standard/mod.rs
index 875acfd9..32dcbd95 100644
--- a/core/expression/src/parser/standard/mod.rs
+++ b/core/expression/src/parser/standard/mod.rs
@@ -37,7 +37,7 @@ where
}
pub fn parse(&self) -> ParserResult<&'b Node<'b>> {
- let result = self.parse_expression(0)?;
+ let result = self.expression(0)?;
if !self.iterator.is_done() {
let token = self.iterator.current();
return Err(FailedToParse {
@@ -48,8 +48,8 @@ where
return Ok(result);
}
- fn parse_expression(&self, precedence: u8) -> ParserResult<&'b Node<'b>> {
- let mut node_left = self.parse_primary()?;
+ fn expression(&self, precedence: u8) -> ParserResult<&'b Node<'b>> {
+ let mut node_left = self.primary_expression()?;
let mut token = self.iterator.current();
while !self.iterator.is_done() {
@@ -58,8 +58,8 @@ where
if op.precedence >= precedence {
self.iterator.next()?;
let node_right = match op.associativity {
- Associativity::Left => self.parse_expression(op.precedence + 1)?,
- _ => self.parse_expression(op.precedence)?,
+ Associativity::Left => self.expression(op.precedence + 1)?,
+ _ => self.expression(op.precedence)?,
};
node_left = self.iterator.node(Node::Binary {
@@ -77,36 +77,36 @@ where
}
if precedence == 0 {
- node_left = self.parse_conditional(node_left)?;
+ node_left = self.conditional(node_left)?;
}
Ok(node_left)
}
- fn parse_primary(&self) -> ParserResult<&'b Node<'b>> {
+ fn primary_expression(&self) -> ParserResult<&'b Node<'b>> {
let token = self.iterator.current();
if token.kind == TokenKind::Operator {
if let Some(op) = UNARY_OPERATORS.get(token.value) {
self.iterator.next()?;
- let expr = self.parse_expression(op.precedence)?;
+ let expr = self.expression(op.precedence)?;
let node = self.iterator.node(Node::Unary {
operator: self.iterator.str_value(token.value),
node: expr,
})?;
- return self.parse_postfix(node);
+ return self.postfix(node);
}
}
- if let Some(interval_node) = self.parse_interval()? {
- return self.parse_postfix(interval_node);
+ if let Some(interval_node) = self.interval()? {
+ return self.postfix(interval_node);
}
if token.kind == TokenKind::Bracket && token.value == "(" {
self.iterator.next()?;
- let expr = self.parse_expression(0)?;
+ let expr = self.expression(0)?;
self.iterator.expect(TokenKind::Bracket, Some(&[")"]))?;
- return self.parse_postfix(expr);
+ return self.postfix(expr);
}
if self.depth.get() > 0 {
@@ -115,7 +115,7 @@ where
self.iterator.next()?;
}
let node = self.iterator.node(Node::Pointer)?;
- return self.parse_postfix(node);
+ return self.postfix(node);
}
} else if token.kind == TokenKind::Operator && (token.value == "#" || token.value == ".") {
return Err(UnexpectedToken {
@@ -124,10 +124,10 @@ where
});
}
- self.parse_primary_expression()
+ self.literal()
}
- fn parse_conditional(&self, node: &'b Node<'b>) -> ParserResult<&'b Node<'b>> {
+ fn conditional(&self, node: &'b Node<'b>) -> ParserResult<&'b Node<'b>> {
let mut nd = self.iterator.node(node.clone())?;
let mut expr1: &'b Node;
let mut expr2: &'b Node;
@@ -139,13 +139,13 @@ where
let token = self.iterator.current();
if token.kind != TokenKind::Operator && token.value != ":" {
- expr1 = self.parse_expression(0)?;
+ expr1 = self.expression(0)?;
self.iterator.expect(TokenKind::Operator, Some(&[":"]))?;
- expr2 = self.parse_expression(0)?;
+ expr2 = self.expression(0)?;
} else {
self.iterator.next()?;
expr1 = node;
- expr2 = self.parse_expression(0)?;
+ expr2 = self.expression(0)?;
}
nd = self.iterator.node(Node::Conditional {
@@ -158,7 +158,7 @@ where
Ok(nd)
}
- fn parse_primary_expression(&self) -> ParserResult<&'b Node<'b>> {
+ fn literal(&self) -> ParserResult<&'b Node<'b>> {
let node: &'b Node;
let token = self.iterator.current();
@@ -168,14 +168,14 @@ where
match token.value {
"true" | "false" => return self.iterator.bool(token),
"null" => return self.iterator.null(token),
- _ => node = self.parse_identifier_expression(token)?,
+ _ => node = self.identifier_expression(token)?,
}
}
TokenKind::Number => return self.iterator.number(token),
TokenKind::String => return self.iterator.string(token),
_ => {
if token.kind == TokenKind::Bracket && token.value == "[" {
- node = self.parse_array(token)?;
+ node = self.array(token)?;
} else {
return Err(UnexpectedToken {
expected: "identifier, string, number or opening bracket".to_string(),
@@ -185,10 +185,10 @@ where
}
}
- self.parse_postfix(node)
+ self.postfix(node)
}
- fn parse_interval(&self) -> ParserResult