From 5fe518bbc3e8dd91f4452947af5dce6a2811ce5b Mon Sep 17 00:00:00 2001 From: Renaud G Date: Sat, 25 Jan 2014 12:44:59 +0100 Subject: fix some issue with parentheses management. --- diceparser.cpp | 338 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 197 insertions(+), 141 deletions(-) (limited to 'diceparser.cpp') diff --git a/diceparser.cpp b/diceparser.cpp index 5ddf172..0f5d231 100644 --- a/diceparser.cpp +++ b/diceparser.cpp @@ -49,33 +49,24 @@ ExecutionNode* DiceParser::getLatestNode(ExecutionNode* node) bool DiceParser::parseLine(QString str) { - m_command = str; - m_start = new StartingNode(); - ExecutionNode* newNode = NULL; + m_command = str; + m_start = new StartingNode(); + ExecutionNode* newNode = NULL; + m_current = m_start; - bool keepParsing = readExpression(str,newNode); + bool keepParsing = readExpression(str,newNode); - if(keepParsing) + while(keepParsing) { - m_start->setNextNode(newNode); -// if(NULL==m_start) -// { -// m_start = m_current; -// } - - - - ExecutionNode* current = getLatestNode(m_start); - - - + m_current->setNextNode(newNode); + m_current = getLatestNode(m_current); keepParsing =!str.isEmpty(); if(keepParsing) { - keepParsing = readOperator(str,current); + keepParsing = readOperator(str,m_current); - current = getLatestNode(current); + m_current = getLatestNode(m_current); } return true; } @@ -85,56 +76,97 @@ bool DiceParser::parseLine(QString str) bool DiceParser::readExpression(QString& str,ExecutionNode* & node) { - int myNumber = 1; - bool hasReadNumber=false; + + + + + + + + + // int myNumber = 1; + // bool hasReadNumber=false; + ExecutionNode* operandNode=NULL; if(m_parsingToolbox->readOpenParentheses(str)) { ExecutionNode* internalNode=NULL; if(readExpression(str,internalNode)) { - ParenthesesNode* parentheseNode = new ParenthesesNode(); - parentheseNode->setInternelNode(internalNode); - node = parentheseNode; - //node->setNextNode(parentheseNode); - if(m_parsingToolbox->readCloseParentheses(str)) + ParenthesesNode* parentheseNode = new ParenthesesNode(); + parentheseNode->setInternelNode(internalNode); + node = parentheseNode; + if(m_parsingToolbox->readCloseParentheses(str)) + { + + ExecutionNode* diceNode=NULL; + if(readDice(str,diceNode)) { - return true; + parentheseNode->setNextNode(diceNode); } + return true; + } + } } - NumberNode* myNumberNode = NULL; - if(NULL==node) + else if(readOperand(str,operandNode)) { - hasReadNumber= m_parsingToolbox->readNumber(str,myNumber); + ExecutionNode* diceNode=NULL; + if(readDice(str,diceNode)) + { + operandNode->setNextNode(diceNode); + } + node = operandNode; + + operandNode= getLatestNode(operandNode); + while(readOperator(str,operandNode)); - myNumberNode = new NumberNode(); - myNumberNode->setNumber(myNumber); - } - bool keepParsing = true; - ExecutionNode* execNode=NULL; - keepParsing = readDiceExpression(str,execNode); - if(NULL!=myNumberNode) - { - myNumberNode->setNextNode(execNode); - node = myNumberNode; } else { - node = execNode; - } - if(NULL!=execNode) - { - execNode = getLatestNode(execNode); - while(keepParsing) + ExecutionNode* diceNode=NULL; + if(readDice(str,diceNode)) { - keepParsing = readOperator(str,execNode); - execNode = getLatestNode(execNode); + NumberNode* numberNode=new NumberNode(); + numberNode->setNumber(1); + numberNode->setNextNode(diceNode); + node = numberNode; } } + // NumberNode* myNumberNode = NULL; + // if(NULL==node) + // { + // hasReadNumber= m_parsingToolbox->readNumber(str,myNumber); + + // myNumberNode = new NumberNode(); + // myNumberNode->setNumber(myNumber); + // } + + + // bool keepParsing = true; + // ExecutionNode* execNode=NULL; + // keepParsing = readDiceExpression(str,execNode); + // if(NULL!=myNumberNode) + // { + // myNumberNode->setNextNode(execNode); + // node = myNumberNode; + // } + // else + // { + // node = execNode; + // } + // if(NULL!=execNode) + // { + // execNode = getLatestNode(execNode); + // while(keepParsing) + // { + // keepParsing = readOperator(str,execNode); + // execNode = getLatestNode(execNode); + // } + // } @@ -146,7 +178,7 @@ bool DiceParser::readExpression(QString& str,ExecutionNode* & node) void DiceParser::Start() { - m_start->run(); + m_start->run(); } void DiceParser::displayResult() { @@ -214,7 +246,7 @@ void DiceParser::displayResult() if(!resulStr.isEmpty()) { - stream << dieValue.arg(face).arg(resulStr); + stream << dieValue.arg(face).arg(resulStr); } } @@ -224,9 +256,9 @@ void DiceParser::displayResult() QTextStream out(stdout); out << str << "you rolled: " <readNumber(str,num)) { DiceRollerNode* drNode = new DiceRollerNode(num); -// dice.m_diceOp = myOperator; -// dice.m_faces = num; + // dice.m_diceOp = myOperator; + // dice.m_faces = num; node = drNode; + ExecutionNode* current = drNode; + while(readOption(str,current)) + { + current = getLatestNode(current); + } + + return true; } } @@ -271,41 +310,41 @@ bool DiceParser::readDiceExpression(QString& str,ExecutionNode* & node) bool returnVal=false; - /*ExecutionNode* operandeNode = NULL; + /*ExecutionNode* operandeNode = NULL; if(readExpression(str,operandeNode)) {*/ - // bool hasRead = m_parsingToolbox->readNumber(str,number); + // bool hasRead = m_parsingToolbox->readNumber(str,number); - /*NumberNode* numberNode = new NumberNode(); + /*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* next = NULL; + if(readDice(str,next)) + { + //DiceRollerNode* next = addRollDiceNode(myDice.m_faces,operandeNode); + //numberNode->setNextNode(next); already done in addRollDiceNode method - ExecutionNode* latest = next; - while(readOption(str,latest)) - { - while(NULL!=latest->getNextNode()) - { - latest = latest->getNextNode(); - } - } - node = next; - returnVal = true; + ExecutionNode* latest = next; + while(readOption(str,latest)) + { + while(NULL!=latest->getNextNode()) + { + latest = latest->getNextNode(); } - /* else if(NULL!=operandeNode) + } + + node = next; + returnVal = true; + } + /* else if(NULL!=operandeNode) { //setCurrentNode(numberNode); returnVal = true; @@ -318,13 +357,13 @@ bool DiceParser::readDiceExpression(QString& str,ExecutionNode* & node) } } }*/ - else - { - qDebug() << "error" << number << str; - returnVal = false; - } + else + { + qDebug() << "error" << number << str; + returnVal = false; + } - // } + // } return returnVal; @@ -387,30 +426,30 @@ 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)) { - int myNumber=0; - if(m_parsingToolbox->readNumber(str,myNumber)) + if(!hasDice) { - if(!hasDice) - { - previous = addRollDiceNode(10,previous); - } + previous = addRollDiceNode(10,previous); + } - node = m_parsingToolbox->addSort(previous,false); + node = m_parsingToolbox->addSort(previous,false); - KeepDiceExecNode* nodeK = new KeepDiceExecNode(); - nodeK->setDiceKeepNumber(myNumber); + KeepDiceExecNode* nodeK = new KeepDiceExecNode(); + nodeK->setDiceKeepNumber(myNumber); - node->setNextNode(nodeK); - node = nodeK; - isFine = true; + node->setNextNode(nodeK); + node = nodeK; + isFine = true; - } } - break; - case KeepAndExplose: + } + break; + case KeepAndExplose: { int myNumber=0; if(m_parsingToolbox->readNumber(str,myNumber)) @@ -433,56 +472,56 @@ bool DiceParser::readOption(QString& str,ExecutionNode* previous, bool hasDice) } } break; - break; - case Sort: - { - node = m_parsingToolbox->addSort(previous,false); + break; + case Sort: + { + node = m_parsingToolbox->addSort(previous,false); - isFine = true; - } - break; - case Count: + isFine = true; + } + break; + case Count: + { + Validator* validator = m_parsingToolbox->readValidator(str); + if(NULL!=validator) { - Validator* validator = m_parsingToolbox->readValidator(str); - if(NULL!=validator) - { - CountExecuteNode* countNode = new CountExecuteNode(); - countNode->setValidator(validator); + CountExecuteNode* countNode = new CountExecuteNode(); + countNode->setValidator(validator); - previous->setNextNode(countNode); - node = countNode; - isFine = true; - } + previous->setNextNode(countNode); + node = countNode; + isFine = true; } - break; - case Reroll: + } + break; + case Reroll: + { + Validator* validator = m_parsingToolbox->readValidator(str); + if(NULL!=validator) { - Validator* validator = m_parsingToolbox->readValidator(str); - if(NULL!=validator) - { - RerollDiceNode* rerollNode = new RerollDiceNode(); - rerollNode->setValidator(validator); - previous->setNextNode(rerollNode); - node = rerollNode; - isFine = true; - + RerollDiceNode* rerollNode = new RerollDiceNode(); + rerollNode->setValidator(validator); + previous->setNextNode(rerollNode); + node = rerollNode; + isFine = true; - } } - break; - case Explosing: + + } + break; + case Explosing: + { + Validator* validator = m_parsingToolbox->readValidator(str); + if(NULL!=validator) { - Validator* validator = m_parsingToolbox->readValidator(str); - if(NULL!=validator) - { - ExploseDiceNode* explosedNode = new ExploseDiceNode(); - explosedNode->setValidator(validator); - previous->setNextNode(explosedNode); - node = explosedNode; - isFine = true; - } + ExploseDiceNode* explosedNode = new ExploseDiceNode(); + explosedNode->setValidator(validator); + previous->setNextNode(explosedNode); + node = explosedNode; + isFine = true; } + } } } @@ -497,17 +536,34 @@ bool DiceParser::readOption(QString& str,ExecutionNode* previous, bool hasDice) bool DiceParser::readOperand(QString& str,ExecutionNode* & node) { int myNumber=1; + ExecutionNode* myNode=NULL; + if(m_parsingToolbox->readNumber(str,myNumber)) { + NumberNode* myNumberNode = new NumberNode(); + myNumberNode->setNumber(myNumber); + node = myNumberNode; + return true; } - if(readOperator(str,node)) - { +// else if(readExpression(str,myNode)) +// { + +// if(readOperator(str,myNode)) +// { - m_parsingToolbox->readNumber(str,myNumber); - /// @todo implements this +// if(readExpression(str,myNode)) +// { - } +// m_parsingToolbox->readNumber(str,myNumber); +// /// @todo implements this +// } + +// } +// } + + + return false; } -- cgit v1.2.3-70-g09d2