diff options
Diffstat (limited to 'src/nodes.cc')
-rw-r--r-- | src/nodes.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/nodes.cc b/src/nodes.cc new file mode 100644 index 0000000..70b9e50 --- /dev/null +++ b/src/nodes.cc @@ -0,0 +1,77 @@ +#include "nodes.h" +#include "exceptions.h" + +#include <cmath> +#include <sstream> +#include <limits> + +namespace SimpleParser { + +OperandNode::OperandNode(double val) { + this->value_ = val; +} + +double OperandNode::solve() { + return this->value_; +} + +NodeType OperandNode::getType() { + return OPERAND_NODE; +} + +std::string OperandNode::print() { + std::stringstream convertStream; + convertStream.precision(std::numeric_limits<double>::digits10); + + convertStream << this->value_; + + return convertStream.str(); +} + +OperatorNode::OperatorNode(char op) { + this->function_ = op; +} + +double OperatorNode::solve() { + switch ( this->function_ ) { + case '*': { + return this->leftChild->solve() * this->rightChild->solve(); + } + case '/': { + double rightChild = this->rightChild->solve(); + + if ( rightChild != 0 ) { + return this->leftChild->solve() / rightChild; + } + else { + throw divide_exception(); + } + } + case '+': { + return this->leftChild->solve() + this->rightChild->solve(); + } + case '-': { + return this->leftChild->solve() - this->rightChild->solve(); + } + case '^': { + return std::pow( this->leftChild->solve(), this->rightChild->solve() ); + } + default: { + throw operator_exception(); + } + } +} + +NodeType OperatorNode::getType() { + return OPERATOR_NODE; +} + +std::string OperatorNode::print() { + return std::string(1, this->function_); +} + +char OperatorNode::getFunction() { + return this->function_; +} + +} |