aboutsummaryrefslogtreecommitdiff
path: root/src/tree.cc
diff options
context:
space:
mode:
authorAdrian Kummerländer2013-01-05 22:30:35 +0100
committerAdrian Kummerländer2013-01-05 22:30:35 +0100
commitcde848ce1eb995170723f6f070b9fcba0dfdb880 (patch)
treeb28b436619ade0f9b3ff7603cc987d7b5a621ff3 /src/tree.cc
parente3081360c65eb4994e7e8042898cec72de0d560b (diff)
downloadSimpleParser-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.cc69
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();
+}
+
+}