aboutsummaryrefslogtreecommitdiff
path: root/src/tree.cc
diff options
context:
space:
mode:
authorAdrian Kummerländer2013-10-20 00:10:54 +0200
committerAdrian Kummerländer2013-10-20 00:10:54 +0200
commitcf2aa4c9d70fc8ed658c213b2c46bb48ee10e6f7 (patch)
tree02eda2354acb6462977cf9c6babcbd62b446d0e2 /src/tree.cc
parent2b5ed18ae11439897a64708a434e5d7a6edac91e (diff)
downloadSimpleParser-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.cc18
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;