From 1e67a33c0dfd0c8a1d3040a8c22eef84661ee041 Mon Sep 17 00:00:00 2001 From: obiwankennedy Date: Thu, 30 Jan 2014 11:47:39 +0100 Subject: Update diceparser.cpp management operator priority --- diceparser.cpp | 85 +++++++++++++--------------------------------------------- 1 file changed, 19 insertions(+), 66 deletions(-) diff --git a/diceparser.cpp b/diceparser.cpp index 2a1c9f6..5d5d9a3 100644 --- a/diceparser.cpp +++ b/diceparser.cpp @@ -22,12 +22,14 @@ DiceParser::DiceParser() m_mapDiceOp->insert("D",D); m_OptionOp = new QMap(); - m_OptionOp->insert(QObject::tr("k"),keep); + m_OptionOp->insert(QObject::tr("k"),Keep); m_OptionOp->insert(QObject::tr("K"),KeepAndExplose); m_OptionOp->insert(QObject::tr("s"),Sort); m_OptionOp->insert(QObject::tr("c"),Count); m_OptionOp->insert(QObject::tr("r"),Reroll); m_OptionOp->insert(QObject::tr("e"),Explosing); + m_OptionOp->insert(QObject::tr("a"),RerollAndAdd); + m_aliasMap = new QMap; @@ -266,30 +268,10 @@ bool DiceParser::readDiceExpression(QString& str,ExecutionNode* & node) int number=1; bool returnVal=false; - - /*ExecutionNode* operandeNode = NULL; - if(readExpression(str,operandeNode)) - {*/ - // bool hasRead = m_parsingToolbox->readNumber(str,number); - - - - - /*NumberNode* numberNode = new NumberNode(); - numberNode->setNumber(number);*/ - - - ExecutionNode* next = NULL; if(readDice(str,next)) { - //DiceRollerNode* next = addRollDiceNode(myDice.m_faces,operandeNode); - //numberNode->setNextNode(next); already done in addRollDiceNode method - - - - - ExecutionNode* latest = next; + ExecutionNode* latest = next; while(readOption(str,latest)) { while(NULL!=latest->getNextNode()) @@ -301,28 +283,11 @@ bool DiceParser::readDiceExpression(QString& str,ExecutionNode* & node) node = next; returnVal = true; } - /* else if(NULL!=operandeNode) - { - //setCurrentNode(numberNode); - returnVal = true; - ExecutionNode* latest = operandeNode; - while(readOption(str,latest,false)) - { - while(NULL!=latest->getNextNode()) - { - latest = latest->getNextNode(); - } - } - }*/ else { qDebug() << "error" << number << str; returnVal = false; } - - // } - - return returnVal; } bool DiceParser::readOperator(QString& str,ExecutionNode* previous) @@ -340,15 +305,21 @@ bool DiceParser::readOperator(QString& str,ExecutionNode* previous) str=str.remove(0,1);//removal of one character if(readExpression(str,nodeExec)) { - node->setInternalNode(nodeExec); + if(node->getPriority()>nodeExec->getPriority()) + { + node->setNextNode(nodeExec->getNextNode()); + nodeExec->setNextNode(NULL); + } previous->setNextNode(node); - //node = getLatestNode(node); - return true; } } + else + { + delete node; + } return false; } DiceRollerNode* DiceParser::addRollDiceNode(qint64 faces,ExecutionNode* previous) @@ -383,7 +354,7 @@ bool DiceParser::readOption(QString& str,ExecutionNode* previous, bool hasDice) switch(m_OptionOp->value(tmp)) { - case keep: + case Keep: { int myNumber=0; if(m_parsingToolbox->readNumber(str,myNumber)) @@ -452,11 +423,16 @@ bool DiceParser::readOption(QString& str,ExecutionNode* previous, bool hasDice) } break; case Reroll: + case RerollAndAdd: { Validator* validator = m_parsingToolbox->readValidator(str); if(NULL!=validator) { RerollDiceNode* rerollNode = new RerollDiceNode(); + if(m_OptionOp->value(tmp)==RerollAndAdd) + { + rerollNode->setAddingMode(true); + } rerollNode->setValidator(validator); previous->setNextNode(rerollNode); node = rerollNode; @@ -483,10 +459,6 @@ bool DiceParser::readOption(QString& str,ExecutionNode* previous, bool hasDice) } } } - - - - return isFine; } @@ -503,24 +475,5 @@ bool DiceParser::readOperand(QString& str,ExecutionNode* & node) node = myNumberNode; return true; } -// else if(readExpression(str,myNode)) -// { - -// if(readOperator(str,myNode)) -// { - -// if(readExpression(str,myNode)) -// { - -// m_parsingToolbox->readNumber(str,myNumber); -// /// @todo implements this -// } - -// } - -// } - - - return false; } -- cgit v1.2.3-70-g09d2