aboutsummaryrefslogtreecommitdiff
path: root/tree.cpp
diff options
context:
space:
mode:
authorAdrian Kummerländer2013-01-05 22:04:23 +0100
committerAdrian Kummerländer2013-01-05 22:04:23 +0100
commite3081360c65eb4994e7e8042898cec72de0d560b (patch)
tree2cac723733c674381ccaf32df5a64fe23b026467 /tree.cpp
parent0ab1ad8c67ac5579e10104f53040d962a7f98f17 (diff)
downloadSimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar.gz
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar.bz2
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar.lz
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar.xz
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.tar.zst
SimpleParser-e3081360c65eb4994e7e8042898cec72de0d560b.zip
Folder structure change; Further improvements of parser code
Diffstat (limited to 'tree.cpp')
-rw-r--r--tree.cpp119
1 files changed, 0 insertions, 119 deletions
diff --git a/tree.cpp b/tree.cpp
deleted file mode 100644
index 2fd5deb..0000000
--- a/tree.cpp
+++ /dev/null
@@ -1,119 +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_;
-}
-
-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();
-}
-
-}