diff options
author | Adrian Kummerländer | 2013-01-05 22:30:35 +0100 |
---|---|---|
committer | Adrian Kummerländer | 2013-01-05 22:30:35 +0100 |
commit | cde848ce1eb995170723f6f070b9fcba0dfdb880 (patch) | |
tree | b28b436619ade0f9b3ff7603cc987d7b5a621ff3 /src/tree.cpp | |
parent | e3081360c65eb4994e7e8042898cec72de0d560b (diff) | |
download | SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar.gz SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar.bz2 SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar.lz SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar.xz SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.tar.zst SimpleParser-cde848ce1eb995170723f6f070b9fcba0dfdb880.zip |
Moved node classes into separate compilation unit; File extension change
Diffstat (limited to 'src/tree.cpp')
-rw-r--r-- | src/tree.cpp | 127 |
1 files changed, 0 insertions, 127 deletions
diff --git a/src/tree.cpp b/src/tree.cpp deleted file mode 100644 index c8f0aac..0000000 --- a/src/tree.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "tree.h" - -#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() ); - } -} - -NodeType OperatorNode::getType() { - return OPERATOR_NODE; -} - -std::string OperatorNode::print() { - return std::string(1, this->function_); -} - -char OperatorNode::getFunction() { - return this->function_; -} - -void Tree::setRoot(Node* root) { - this->root_node_ = root; -} - -double Tree::solve() { - return this->root_node_->solve(); -} - -Node* Tree::addOperand(Node** place, double value) { - this->node_collection_.emplace_back(new OperandNode(value)); - - if ( place != nullptr ) { - *place = this->node_collection_.back().get(); - } - - return this->node_collection_.back().get(); -} - -Node* Tree::addOperator(Node** place, char oper) { - this->node_collection_.emplace_back(new OperatorNode(oper)); - - if ( place != nullptr ) { - *place = this->node_collection_.back().get(); - } - - return this->node_collection_.back().get(); -} - -std::string Tree::print(std::string term) { - std::stringstream out; - out.precision(std::numeric_limits<double>::digits10); - - out << "digraph \"" << term << "\"" << std::endl - << "{" << std::endl - << "node [shape = box];" << std::endl; - - int i = 0; - - for ( auto it = this->node_collection_.begin(); it != this->node_collection_.end(); ++it ) { - out << "node" << i << " [ label = \"" << (*it)->print() << "\"];" << std::endl; - - if ( (*it)->getType() == OPERATOR_NODE ) { - for ( auto iter = this->node_collection_.begin(); iter != this->node_collection_.end(); ++iter ) { - if ( (*iter).get() == (*it)->leftChild ) { - out << "\"node" << i << "\" -> \"node" << (iter - this->node_collection_.begin()) << "\";" << std::endl; - } - if ( (*iter).get() == (*it)->rightChild ) { - out << "\"node" << i << "\" -> \"node" << (iter - this->node_collection_.begin()) << "\";" << std::endl; - } - } - } - - i++; - } - - out << "}" << std::endl; - - return out.str(); -} - -} |