use super::token::Token;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum NodeType {
NumOP,
NoOP,
BinOP,
UnaryOP,
CompoundOP,
VariableOP,
AssignOP,
}
pub struct Node {
node_type: NodeType,
token: Token,
left: Option<Box<Node>>,
mid: Option<Box<Node>>,
right: Option<Box<Node>>,
children: Option<Vec<Box<Node>>>,
}
impl Node {
pub fn num(token: Token) -> Box<Self> {
Box::new(Self {
node_type: NodeType::NumOP,
left: None,
mid: None,
right: None,
token: token,
children: None,
})
}
pub fn var(token: Token) -> Box<Self> {
Box::new(Self {
node_type: NodeType::VariableOP,
left: None,
mid: None,
right: None,
token: token,
children: None,
})
}
pub fn assign(token: Token, left: Box<Node>, right: Box<Node>) -> Box<Self> {
Box::new(Self {
node_type: NodeType::AssignOP,
left: Some(left),
mid: None,
right: Some(right),
token: token,
children: None,
})
}
pub fn bin_op(token: Token, left: Box<Node>, right: Box<Node>) -> Box<Self> {
Box::new(Self {
node_type: NodeType::BinOP,
left: Some(left),
mid: None,
right: Some(right),
token: token,
children: None,
})
}
pub fn unary_op(token: Token, mid: Box<Node>) -> Box<Self> {
Box::new(Self {
node_type: NodeType::UnaryOP,
left: None,
mid: Some(mid),
right: None,
token: token,
children: None,
})
}
pub fn no_op() -> Box<Self> {
Box::new(Self {
node_type: NodeType::NoOP,
left: None,
mid: None,
right: None,
token: Token::empty(),
children: None,
})
}
pub fn compound_op(token: Token, children: Vec<Box<Node>>) -> Box<Self> {
Box::new(Self {
node_type: NodeType::CompoundOP,
left: None,
mid: None,
right: None,
token: token,
children: Some(children),
})
}
pub fn get_token(&self) -> &Token {
return &self.token;
}
pub fn get_left(&self) -> &Box<Node> {
match &self.left {
Some(i) => i,
None => panic!("Tried to get left node when no left node. Aborting."),
}
}
pub fn get_mid(&self) -> &Box<Node> {
match &self.mid {
Some(i) => i,
None => panic!("Tried to get left node when no left node. Aborting."),
}
}
pub fn get_right(&self) -> &Box<Node> {
match &self.right {
Some(i) => i,
None => panic!("Tried to get left node when no left node. Aborting."),
}
}
pub fn get_children(&self) -> &Vec<Box<Node>> {
match &self.children {
Some(i) => i,
None => panic!("Tried to get left node when no left node. Aborting."),
}
}
pub fn get_node_type(&self) -> &NodeType {
return &self.node_type;
}
}