diff options
author | Adrian Kummerländer | 2013-10-20 00:10:54 +0200 |
---|---|---|
committer | Adrian Kummerländer | 2013-10-20 00:10:54 +0200 |
commit | cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7 (patch) | |
tree | 02eda2354acb6462977cf9c6babcbd62b446d0e2 /src/tree.cc | |
parent | 2b5ed18ae11439897a64708a434e5d7a6edac91e (diff) | |
download | SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.gz SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.bz2 SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.lz SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.xz SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.tar.zst SimpleParser-cf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7.zip |
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
Diffstat (limited to 'src/tree.cc')
-rw-r--r-- | src/tree.cc | 18 |
1 files changed, 14 insertions, 4 deletions
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<Node*>& 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<OperatorNode*>(topNodeFrom(operatorStack)) ); - if ( token > lastNode->getToken() ) { + if ( getPrecedence(token) > getPrecedence(lastNode->getToken()) ) { operatorStack.push( this->addNode<OperatorNode>(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<ConstantNode>(nullptr, tmpLexer[0]) + this->addNode<ConstantNode>(nullptr, + tmpLexer[0], + this->constants_) ); break; |