Quality-of-life refactoring
This commit is contained in:
+23
-1
@@ -108,7 +108,7 @@ pub enum Node {
|
|||||||
ArrayRef(ArrayRef),
|
ArrayRef(ArrayRef),
|
||||||
Name(String),
|
Name(String),
|
||||||
Address(String),
|
Address(String),
|
||||||
Expr(Box<Node>, Vec<(Operator, Node)>),
|
Expr(BoxNode, Vec<(Operator, Node)>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<i32> for Node {
|
impl From<i32> for Node {
|
||||||
@@ -123,5 +123,27 @@ impl From<&str> for Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
|
pub struct BoxNode(pub Box<Node>);
|
||||||
|
|
||||||
|
impl From<i32> for BoxNode {
|
||||||
|
fn from(val: i32) -> Self {
|
||||||
|
BoxNode(Box::from(Node::Number(val)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Node> for BoxNode {
|
||||||
|
fn from(val: Node) -> Self {
|
||||||
|
BoxNode(Box::from(val))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BoxNode> for Node {
|
||||||
|
fn from(val: BoxNode) -> Self {
|
||||||
|
*(val.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Clone, Debug)]
|
#[derive(Eq, PartialEq, Clone, Debug)]
|
||||||
pub struct ArrayRef {}
|
pub struct ArrayRef {}
|
||||||
|
|||||||
@@ -375,7 +375,7 @@ impl AstNode for Node {
|
|||||||
Rule::expr | Rule::term => {
|
Rule::expr | Rule::term => {
|
||||||
let mut children = pair.into_inner();
|
let mut children = pair.into_inner();
|
||||||
let car = Node::from_pair(children.next().unwrap());
|
let car = Node::from_pair(children.next().unwrap());
|
||||||
Node::Expr(Box::new(car), parse_expr(children))
|
Node::Expr(car.into(), parse_expr(children))
|
||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
@@ -398,12 +398,12 @@ fn parse_expr(mut cdr: Pairs) -> Vec<(Operator, Node)> {
|
|||||||
fn shake_expr(node: Node) -> Node {
|
fn shake_expr(node: Node) -> Node {
|
||||||
match node {
|
match node {
|
||||||
Node::Expr(car, cdr) => {
|
Node::Expr(car, cdr) => {
|
||||||
let shaken_car = shake_expr(*car);
|
let shaken_car = shake_expr(car.into());
|
||||||
if cdr.is_empty() {
|
if cdr.is_empty() {
|
||||||
shaken_car
|
shaken_car
|
||||||
} else {
|
} else {
|
||||||
let shaken_cdr = cdr.into_iter().map(|(op, n)| (op, shake_expr(n))).collect();
|
let shaken_cdr = cdr.into_iter().map(|(op, n)| (op, shake_expr(n))).collect();
|
||||||
Node::Expr(Box::from(shaken_car), shaken_cdr)
|
Node::Expr(shaken_car.into(), shaken_cdr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => node,
|
_ => node,
|
||||||
@@ -638,24 +638,21 @@ mod test {
|
|||||||
// Two vals with an operator
|
// Two vals with an operator
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Node::parse("23 + 5"),
|
Node::parse("23 + 5"),
|
||||||
Ok(Expr(Number(23).into(), vec![(Add, Number(5))]))
|
Ok(Expr(23.into(), vec![(Add, Number(5))]))
|
||||||
);
|
);
|
||||||
|
|
||||||
// Multiple terms at the same precedence level
|
// Multiple terms at the same precedence level
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Node::parse("1 + 2 + 3"),
|
Node::parse("1 + 2 + 3"),
|
||||||
Ok(Expr(
|
Ok(Expr(1.into(), vec![(Add, 2.into()), (Add, 3.into())]))
|
||||||
Number(1).into(),
|
|
||||||
vec![(Add, 2.into()), (Add, 3.into())]
|
|
||||||
))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Higher precedence levels
|
// Higher precedence levels
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Node::parse("1 + 2 * 3"),
|
Node::parse("1 + 2 * 3"),
|
||||||
Ok(Node::Expr(
|
Ok(Node::Expr(
|
||||||
Number(1).into(),
|
1.into(),
|
||||||
vec![(Add, Expr(Number(2).into(), vec![(Mul, 3.into())]))]
|
vec![(Add, Expr(2.into(), vec![(Mul, 3.into())]))]
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@@ -665,7 +662,7 @@ mod test {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
Node::parse("2 * 3 + 4"),
|
Node::parse("2 * 3 + 4"),
|
||||||
Ok(Expr(
|
Ok(Expr(
|
||||||
Expr(Number(2).into(), vec![(Mul, 3.into())]).into(),
|
Expr(2.into(), vec![(Mul, 3.into())]).into(),
|
||||||
vec![(Add, 4.into())]
|
vec![(Add, 4.into())]
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
@@ -674,7 +671,7 @@ mod test {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
Node::parse("(1 + 2) * 3"),
|
Node::parse("(1 + 2) * 3"),
|
||||||
Ok(Node::Expr(
|
Ok(Node::Expr(
|
||||||
Expr(Number(1).into(), vec![(Add, 2.into())]).into(),
|
Expr(1.into(), vec![(Add, 2.into())]).into(),
|
||||||
vec![(Mul, 3.into())]
|
vec![(Mul, 3.into())]
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user