fix #2
This commit is contained in:
parent
446bf1efec
commit
0c4413836d
@ -594,6 +594,13 @@ mod tests {
|
|||||||
|
|
||||||
assert_eq!(tree.parse_node(), Err(Error::CommaNotWithFunction));
|
assert_eq!(tree.parse_node(), Err(Error::CommaNotWithFunction));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eval_issue_2() {
|
||||||
|
assert_eq!(eval("2 * (4 + 0) + 4"), Ok(to_value(12)));
|
||||||
|
assert_eq!(eval("2 * (2 + 2) + (1 + 3)"), Ok(to_value(12)));
|
||||||
|
assert_eq!(eval("2 * (4) + (4)"), Ok(to_value(12)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable", test))]
|
#[cfg(all(feature = "unstable", test))]
|
||||||
|
@ -14,7 +14,7 @@ pub struct Node {
|
|||||||
impl Node {
|
impl Node {
|
||||||
pub fn new(operator: Operator) -> Node {
|
pub fn new(operator: Operator) -> Node {
|
||||||
Node {
|
Node {
|
||||||
operator: operator,
|
operator,
|
||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
closed: false,
|
closed: false,
|
||||||
}
|
}
|
||||||
@ -47,7 +47,7 @@ impl Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_value_or_enough(&self) -> bool {
|
pub fn is_value_or_full_children(&self) -> bool {
|
||||||
if self.operator.is_value_or_ident() {
|
if self.operator.is_value_or_ident() {
|
||||||
true
|
true
|
||||||
} else if self.operator.can_have_child() {
|
} else if self.operator.can_have_child() {
|
||||||
@ -57,6 +57,10 @@ impl Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_unclosed_arithmetic(&self) -> bool {
|
||||||
|
return !self.closed && self.operator.can_have_child() && self.operator.can_have_child()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_unclosed_function(&self) -> bool {
|
pub fn is_unclosed_function(&self) -> bool {
|
||||||
match self.operator {
|
match self.operator {
|
||||||
Operator::Function(_) => !self.closed,
|
Operator::Function(_) => !self.closed,
|
||||||
|
@ -205,7 +205,7 @@ impl Tree {
|
|||||||
Operator::Rem(priority) => {
|
Operator::Rem(priority) => {
|
||||||
if !parsing_nodes.is_empty() {
|
if !parsing_nodes.is_empty() {
|
||||||
let prev = parsing_nodes.pop().unwrap();
|
let prev = parsing_nodes.pop().unwrap();
|
||||||
if prev.is_value_or_enough() {
|
if prev.is_value_or_full_children() {
|
||||||
if prev.operator.get_priority() < priority && !prev.closed {
|
if prev.operator.get_priority() < priority && !prev.closed {
|
||||||
parsing_nodes.extend_from_slice(&rob_to(prev, operator.to_node()));
|
parsing_nodes.extend_from_slice(&rob_to(prev, operator.to_node()));
|
||||||
} else {
|
} else {
|
||||||
@ -468,7 +468,7 @@ fn append_value_to_last_node(parsing_nodes: &mut Vec<Node>,
|
|||||||
} else if prev.is_left_square_bracket() {
|
} else if prev.is_left_square_bracket() {
|
||||||
parsing_nodes.push(prev);
|
parsing_nodes.push(prev);
|
||||||
parsing_nodes.push(node);
|
parsing_nodes.push(node);
|
||||||
} else if prev.is_value_or_enough() {
|
} else if prev.is_value_or_full_children() {
|
||||||
return Err(Error::DuplicateValueNode);
|
return Err(Error::DuplicateValueNode);
|
||||||
} else if prev.is_enough() {
|
} else if prev.is_enough() {
|
||||||
parsing_nodes.push(prev);
|
parsing_nodes.push(prev);
|
||||||
@ -535,6 +535,9 @@ fn close_bracket(parsing_nodes: &mut Vec<Node>, bracket: Operator) -> Result<(),
|
|||||||
penult.closed = true;
|
penult.closed = true;
|
||||||
penult.add_child(current);
|
penult.add_child(current);
|
||||||
parsing_nodes.push(penult);
|
parsing_nodes.push(penult);
|
||||||
|
} else if penult.is_unclosed_arithmetic() {
|
||||||
|
penult.add_child(current);
|
||||||
|
parsing_nodes.push(penult);
|
||||||
} else {
|
} else {
|
||||||
parsing_nodes.push(penult);
|
parsing_nodes.push(penult);
|
||||||
parsing_nodes.push(current);
|
parsing_nodes.push(current);
|
||||||
|
Loading…
Reference in New Issue
Block a user