#include "nodes.h" #include "utils.h" #include "tree.h" #include "exceptions.h" #include #include #include namespace SimpleParser { OperandNode::OperandNode(double value): value_{value} { } double OperandNode::solve() const { return this->value_; } std::string OperandNode::print() const { std::stringstream convertStream; convertStream.precision(std::numeric_limits::digits10); convertStream << this->value_; return convertStream.str(); } OperatorNode::OperatorNode(TokenType token): operator_{token} { } double OperatorNode::solve() const { switch ( this->operator_ ) { case TokenType::OPERATOR_MULTIPLY: { return this->leftChild->solve() * this->rightChild->solve(); } case TokenType::OPERATOR_PLUS: { return this->leftChild->solve() + this->rightChild->solve(); } case TokenType::OPERATOR_MINUS: { return this->leftChild->solve() - this->rightChild->solve(); } case TokenType::OPERATOR_POWER: { return std::pow( this->leftChild->solve(), this->rightChild->solve() ); } case TokenType::OPERATOR_DIVIDE: { const double rightChild{ this->rightChild->solve() }; if ( rightChild != 0 ) { return this->leftChild->solve() / rightChild; } else { throw divide_exception(); } } default: { throw operator_exception(); } } } std::string OperatorNode::print() const { switch ( this->operator_ ) { case TokenType::OPERATOR_PLUS: { return std::string(1, '+'); } case TokenType::OPERATOR_MINUS: { return std::string(1, '-'); } case TokenType::OPERATOR_MULTIPLY: { return std::string(1, '*'); } case TokenType::OPERATOR_DIVIDE: { return std::string(1, '/'); } case TokenType::OPERATOR_POWER: { return std::string(1, '^'); } default: { throw operator_exception(); } } } TokenType OperatorNode::token() const { return this->operator_; } ConstantNode::ConstantNode( const std::string& identifier, const ConstantMap* constants ): identifier_(identifier), constants_(constants) { } double ConstantNode::solve() const { if ( this->constants_ != nullptr ) { try { return this->constants_->at(this->identifier_); } catch ( std::out_of_range& ) { throw identifier_exception(); } } else { throw identifier_exception(); } } std::string ConstantNode::print() const { return this->identifier_; } }