diff options
| author | 2019-07-12 21:00:42 +0000 | |
|---|---|---|
| committer | 2019-07-12 21:00:42 +0000 | |
| commit | 5c2fbf1edc7547333739d3d643c4abee5ce6f942 (patch) | |
| tree | 6e9f4a709fd497fed1cf7f24bb2c3db421eb8711 /diceparser.cpp | |
| parent | 4f495aaaecb3118b835504e9bc1347f934aa49d1 (diff) | |
| parent | a3c3551815845cbc4bdf891b5f01406414abd4d2 (diff) | |
| download | OneRoll-5c2fbf1edc7547333739d3d643c4abee5ce6f942.tar.gz OneRoll-5c2fbf1edc7547333739d3d643c4abee5ce6f942.zip | |
Merge branch 'new_operator_and_fix' into 'master'
Value list node and occurence improvements
See merge request kde/rolisteam-diceparser!1
Diffstat (limited to 'diceparser.cpp')
| -rw-r--r-- | diceparser.cpp | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/diceparser.cpp b/diceparser.cpp index 18be076..75247ba 100644 --- a/diceparser.cpp +++ b/diceparser.cpp @@ -28,6 +28,7 @@ #include "node/bind.h" #include "node/countexecutenode.h" +#include "node/dicerollernode.h" #include "node/explodedicenode.h" #include "node/filternode.h" #include "node/groupnode.h" @@ -49,10 +50,10 @@ #include "node/startingnode.h" #include "node/stringnode.h" #include "node/uniquenode.h" +#include "node/valueslistnode.h" #include "node/variablenode.h" #include "booleancondition.h" -#include "node/dicerollernode.h" #include "parsingtoolbox.h" #include "range.h" #include "validator.h" @@ -176,7 +177,6 @@ bool DiceParser::parseLine(QString str, bool allowAlias) } m_command= str; bool hasInstruction= readInstructionList(str); - bool value= hasInstruction; if(!hasInstruction) { @@ -194,7 +194,6 @@ bool DiceParser::parseLine(QString str, bool allowAlias) ExecutionNode::UNEXPECTED_CHARACTER, QObject::tr("Unexpected character at %1 - end of command was ignored \"%2\"").arg(i).arg(str)); } - if(!m_errorMap.isEmpty()) value= false; @@ -233,6 +232,11 @@ bool DiceParser::readExpression(QString& str, ExecutionNode*& node) } } } + else if(readOperatorFromNull(str, operandNode)) + { + node= operandNode; + return true; + } else if(m_parsingToolbox->readOperand(str, operandNode)) { ExecutionNode* diceNode= nullptr; @@ -266,7 +270,7 @@ bool DiceParser::readExpression(QString& str, ExecutionNode*& node) node= operandNode; return true; } - else if(readOperatorFromNull(str, operandNode)) + else if(readValuesList(str, operandNode)) { node= operandNode; return true; @@ -316,6 +320,43 @@ bool DiceParser::readOperatorFromNull(QString& str, ExecutionNode*& node) return false; } +bool DiceParser::readValuesList(QString& str, ExecutionNode*& node) +{ + if(str.startsWith("[")) + { + str= str.remove(0, 1); + int pos= ParsingToolBox::findClosingCharacterIndexOf('[', ']', str, 1); // str.indexOf("]"); + if(-1 != pos) + { + QString liststr= str.left(pos); + auto list= liststr.split(","); + str= str.remove(0, pos + 1); + auto values= new ValuesListNode(); + for(auto var : list) + { + qint64 number= 1; + QString error; + if(ParsingToolBox::readDynamicVariable(var, number)) + { + VariableNode* variableNode= new VariableNode(); + variableNode->setIndex(number - 1); + variableNode->setData(&m_startNodes); + values->insertValue(variableNode); + } + else if(ParsingToolBox::readNumber(var, number)) + { + NumberNode* numberNode= new NumberNode(); + numberNode->setNumber(number); + values->insertValue(numberNode); + } + } + node= values; + return true; + } + } + return false; +} + bool DiceParser::readNode(QString& str, ExecutionNode*& node) { if(str.isEmpty()) |