bomlamaal 0.1.0

Bømlamål as a programming language.
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;
    }
}