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.cc | |
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.cc')
-rw-r--r-- | src/tree.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/tree.cc b/src/tree.cc new file mode 100644 index 0000000..675009e --- /dev/null +++ b/src/tree.cc @@ -0,0 +1,69 @@ +#include "tree.h" +#include "exceptions.h" + +#include <sstream> +#include <limits> + +namespace SimpleParser { + +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(); +} + +} |