From cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Sun, 20 Oct 2013 00:10:54 +0200 Subject: Implemented constant identifier functionality * SimpleParser optionally acceps a pointer to an ConstantMap containing string keys mapping to values * Constants are handled in their own ConstantNode class derived from the standard Node class * Operator precedence is now determined separated from the TokenType using a new PrecedenceLevel enum ** Conversion between tokens and their PrecedenceLevel is possible using the new utility function getPrecedence * Added additional test cases for constant identifier resolutions --- src/tree.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/tree.cc') diff --git a/src/tree.cc b/src/tree.cc index f6d2282..7cc3fe8 100644 --- a/src/tree.cc +++ b/src/tree.cc @@ -18,7 +18,14 @@ Node* topNodeFrom(const std::stack& stack) { } Tree::Tree(std::string term): - term_(term) { + term_(term), + constants_(nullptr) { + this->root_node_ = this->buildTree(term); +} + +Tree::Tree(std::string term, const ConstantMap* constants): + term_(term), + constants_(constants) { this->root_node_ = this->buildTree(term); } @@ -114,7 +121,7 @@ Node* Tree::buildTree(std::string term) { static_cast(topNodeFrom(operatorStack)) ); - if ( token > lastNode->getToken() ) { + if ( getPrecedence(token) > getPrecedence(lastNode->getToken()) ) { operatorStack.push( this->addNode(nullptr, token) ); @@ -142,7 +149,8 @@ Node* Tree::buildTree(std::string term) { if ( tmpLexer.size() == 1 ) { switch ( getTokenType(tmpLexer[0][0]) ) { - case TokenType::VALUE_NUMBER: { + case TokenType::VALUE_NUMBER: + case TokenType::OPERATOR_MINUS: { double value; std::istringstream convertStream(tmpLexer[0]); convertStream >> value; @@ -155,7 +163,9 @@ Node* Tree::buildTree(std::string term) { } case TokenType::VALUE_IDENTIFIER: { operandStack.push( - this->addNode(nullptr, tmpLexer[0]) + this->addNode(nullptr, + tmpLexer[0], + this->constants_) ); break; -- cgit v1.2.3