From e18f4a9936d03a112b1a05b24b0559e5be602e0e Mon Sep 17 00:00:00 2001 From: Renaud Guezennec Date: Sun, 30 Mar 2025 03:56:37 +0200 Subject: [math]: operator priority fix issue. --- src/libparser/node/executionnode.h | 2 +- src/libparser/node/parenthesesnode.cpp | 15 +++++++++++++++ src/libparser/node/scalaroperatornode.cpp | 18 +++++++++++++++--- src/libparser/node/scalaroperatornode.h | 15 +++++++++------ 4 files changed, 40 insertions(+), 10 deletions(-) (limited to 'src/libparser/node') diff --git a/src/libparser/node/executionnode.h b/src/libparser/node/executionnode.h index a2912e3..6dba052 100644 --- a/src/libparser/node/executionnode.h +++ b/src/libparser/node/executionnode.h @@ -37,7 +37,7 @@ public: /** * @brief setNextNode */ - void setNextNode(ExecutionNode*); + virtual void setNextNode(ExecutionNode*); /** * @brief getNextNode * @return diff --git a/src/libparser/node/parenthesesnode.cpp b/src/libparser/node/parenthesesnode.cpp index d122fe2..17db85a 100644 --- a/src/libparser/node/parenthesesnode.cpp +++ b/src/libparser/node/parenthesesnode.cpp @@ -39,6 +39,21 @@ void ParenthesesNode::run(ExecutionNode* previous) temp= temp->getNextNode(); } m_result= temp->getResult(); + + if(!m_nextNode) + return; + + auto pNext= m_nextNode->getPriority(); + + if(!m_previousNode) + return; + + auto previousNextNode= m_previousNode->getNextNode(); + if(pNext < getPriority() && previousNextNode != this) + { + m_previousNode->setNextNode(m_nextNode); + m_nextNode= nullptr; + } } QString ParenthesesNode::toString(bool b) const { diff --git a/src/libparser/node/scalaroperatornode.cpp b/src/libparser/node/scalaroperatornode.cpp index 40f725d..5a5e60b 100644 --- a/src/libparser/node/scalaroperatornode.cpp +++ b/src/libparser/node/scalaroperatornode.cpp @@ -21,7 +21,7 @@ ***************************************************************************/ #include "scalaroperatornode.h" -#include "result/diceresult.h" +#include "include/diceparser/parsingtoolbox.h" #include ScalarOperatorNode::ScalarOperatorNode() @@ -252,7 +252,7 @@ QMap ScalarOperatorNode::getExecutionErrorMap() if(nullptr != m_internalNode) { auto keys= m_internalNode->getExecutionErrorMap().keys(); - for(const auto& key : keys) + for(const auto& key : std::as_const(keys)) { m_errors.insert(key, m_internalNode->getExecutionErrorMap().value(key)); } @@ -260,7 +260,7 @@ QMap ScalarOperatorNode::getExecutionErrorMap() if(nullptr != m_nextNode) { auto keys= m_nextNode->getExecutionErrorMap().keys(); - for(auto const& key : keys) + for(auto const& key : std::as_const(keys)) { m_errors.insert(key, m_nextNode->getExecutionErrorMap().value(key)); } @@ -278,3 +278,15 @@ ExecutionNode* ScalarOperatorNode::getCopy() const } return node; } + +void ScalarOperatorNode::setNextNode(ExecutionNode* node) +{ + if(node && node->getPriority() > getPriority()) + { + auto temp= m_internalNode; + temp= ParsingToolBox::getLeafNode(temp); + temp->setNextNode(node); + } + else + ExecutionNode::setNextNode(node); +} diff --git a/src/libparser/node/scalaroperatornode.h b/src/libparser/node/scalaroperatornode.h index 57a1049..73e0bef 100644 --- a/src/libparser/node/scalaroperatornode.h +++ b/src/libparser/node/scalaroperatornode.h @@ -50,7 +50,7 @@ public: /** * @brief run */ - virtual void run(ExecutionNode*); + virtual void run(ExecutionNode*) override; /** * @brief setInternalNode * @param node @@ -61,22 +61,22 @@ public: * @param wl * @return */ - virtual QString toString(bool wl) const; + virtual QString toString(bool wl) const override; /** * @brief getPriority * @return */ - virtual qint64 getPriority() const; + virtual qint64 getPriority() const override; /** * @brief generateDotTree * @param s */ - void generateDotTree(QString& s); + void generateDotTree(QString& s) override; /** * @brief getErrorList * @return */ - virtual QMap getExecutionErrorMap(); + virtual QMap getExecutionErrorMap() override; /** * @brief getArithmeticOperator * @return @@ -92,7 +92,10 @@ public: * @brief getCopy * @return */ - virtual ExecutionNode* getCopy() const; + virtual ExecutionNode* getCopy() const override; + + + void setNextNode(ExecutionNode* node) override; private: /** -- cgit v1.2.3-70-g09d2