aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/diceparser.cpp
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2013-12-29 02:04:19 +0100
committerRenaud G <renaud@rolisteam.org>2013-12-29 02:04:19 +0100
commitf30020384f816b498fe1f6013758a8de37811821 (patch)
tree7388de7fe766fe2973d94a3256f8820e3c7fbcdf /diceparser.cpp
parent7a1784893af6fe986503dc67672135ed05816579 (diff)
downloadOneRoll-f30020384f816b498fe1f6013758a8de37811821.tar.gz
OneRoll-f30020384f816b498fe1f6013758a8de37811821.zip
Firt commit of the new dice system for rolisteam.
Diffstat (limited to 'diceparser.cpp')
-rw-r--r--diceparser.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/diceparser.cpp b/diceparser.cpp
new file mode 100644
index 0000000..6096a4d
--- /dev/null
+++ b/diceparser.cpp
@@ -0,0 +1,179 @@
+#include "diceparser.h"
+#include <QDebug>
+#include <QStringList>
+
+#include "node/dicerollernode.h"
+#include "node/startingnode.h"
+#include "node/scalaroperatornode.h"
+#include "node/numbernode.h"
+
+DiceParser::DiceParser()
+{
+ m_mapDiceOp = new QMap<QString,DiceOperator>();
+ m_mapDiceOp->insert("D",D);
+}
+
+void DiceParser::setCurrentNode(ExecutionNode* node)
+{
+ ExecutionNode* next = node;
+ while(NULL != next->getNextNode() )
+ {
+ next = next->getNextNode();
+ }
+ m_current = next;
+}
+
+void DiceParser::parseLine(QString str)
+{
+ m_start = new StartingNode();
+ m_current = m_start;
+ bool keepParsing = true;
+ ExecutionNode* execNode=NULL;
+ keepParsing = readDiceExpression(str,execNode);
+
+ m_current->setNextNode(execNode);
+ setCurrentNode(execNode);
+
+ execNode=NULL;
+ keepParsing =!str.isEmpty();
+ while(keepParsing)
+ {
+ keepParsing = readOperator(str);
+
+// if(keepParsing)
+// {
+// keepParsing = readDiceExpression(str,execNode);
+
+// m_current->setNextNode(execNode);
+// m_current= execNode;
+
+// if(keepParsing)
+// {
+// keepParsing =!str.isEmpty();
+// }
+// }
+ }
+
+ m_start->run();
+ ExecutionNode* next = m_start;
+ while(NULL != next->getNextNode() )
+ {
+ next = next->getNextNode();
+ }
+ qDebug() << "list:" <<next->getResult()->getResultList() << "sum" <<next->getResult()->getSum() ;
+}
+bool DiceParser::readNumber(QString& str, int& myNumber)
+{
+ if(str.isEmpty())
+ return false;
+
+ QString number;
+ int i=0;
+
+ while(i<str.length() && str[i].isNumber())
+ {
+ number+=str[i];
+ ++i;
+ }
+
+ if(number.isEmpty())
+ return false;
+
+ bool ok;
+ myNumber = number.toInt(&ok);
+ if(ok)
+ {
+ str=str.remove(0,number.size());
+ return true;
+ }
+ return false;
+}
+
+bool DiceParser::readDice(QString& str,Dice& dice)
+{
+ DiceOperator myOperator;
+ if(readDiceOperator(str,myOperator))
+ {
+ int num;
+ if(readNumber(str,num))
+ {
+ dice.m_diceOp = myOperator;
+ dice.m_faces = num;
+ return true;
+ }
+ }
+
+ return false;
+
+}
+bool DiceParser::readDiceOperator(QString& str,DiceOperator& op)
+{
+ QStringList listKey = m_mapDiceOp->keys();
+ foreach(QString key, listKey)
+ {
+ if(str.startsWith(key,Qt::CaseInsensitive))
+ {
+ str=str.remove(0,key.size());
+ op = m_mapDiceOp->value(key);
+ return true;
+ }
+ }
+ return false;
+}
+bool DiceParser::readDiceExpression(QString& str,ExecutionNode* & node)
+{
+ int number=1;
+ bool hasRead = readNumber(str,number);
+
+ NumberNode* numberNode = new NumberNode();
+ numberNode->setNumber(number);
+
+
+ Dice myDice;
+ if(readDice(str,myDice))
+ {
+ DiceRollerNode* next = new DiceRollerNode(myDice.m_faces);
+
+ numberNode->setNextNode(next);
+
+ node = numberNode;
+
+ return true;
+ }
+ else if(hasRead)
+ {
+ node = numberNode;
+ return true;
+ }
+ else
+ {
+ qDebug() << "error" << number << str;
+ return false;
+ }
+
+}
+bool DiceParser::readOperator(QString& str)
+{
+ if(str.isEmpty())
+ {
+ return false;
+ }
+
+ ScalarOperatorNode* node = new ScalarOperatorNode();
+ if(node->setOperatorChar(str[0]))
+ {
+
+ ExecutionNode* nodeExec = NULL;
+ str=str.remove(0,1);//removal of one character
+ if(readDiceExpression(str,nodeExec))
+ {
+
+ node->setInternalNode(nodeExec);
+ m_current->setNextNode(node);
+ m_current= node;
+
+ return true;
+ }
+ }
+ return false;
+}