aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/libparser/node
diff options
context:
space:
mode:
authorRenaud Guezennec <renaud@rolisteam.org>2025-03-30 03:56:37 +0200
committerRenaud Guezennec <renaud@rolisteam.org>2025-03-30 03:58:59 +0200
commite18f4a9936d03a112b1a05b24b0559e5be602e0e (patch)
treee5939fba4307e5b00e3444eb82b477f49d09b166 /src/libparser/node
parent8a3fa044ee7b74be3221717c3f949a10d4e8a178 (diff)
downloadOneRoll-e18f4a9936d03a112b1a05b24b0559e5be602e0e.tar.gz
OneRoll-e18f4a9936d03a112b1a05b24b0559e5be602e0e.zip
[math]: operator priority fix issue.
Diffstat (limited to 'src/libparser/node')
-rw-r--r--src/libparser/node/executionnode.h2
-rw-r--r--src/libparser/node/parenthesesnode.cpp15
-rw-r--r--src/libparser/node/scalaroperatornode.cpp18
-rw-r--r--src/libparser/node/scalaroperatornode.h15
4 files changed, 40 insertions, 10 deletions
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 <QDebug>
ScalarOperatorNode::ScalarOperatorNode()
@@ -252,7 +252,7 @@ QMap<Dice::ERROR_CODE, QString> 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<Dice::ERROR_CODE, QString> 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<Dice::ERROR_CODE, QString> getExecutionErrorMap();
+ virtual QMap<Dice::ERROR_CODE, QString> 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:
/**