aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2019-07-25 09:59:03 +0200
committerRenaud G <renaud@rolisteam.org>2019-07-25 09:59:03 +0200
commit6f499de159eeac37fe473f945042e13359dc2d40 (patch)
tree17356b91f9994ab5b19405072878b8449781e74c /include
parentf5906125576a8323a731c9456ce3dfc53b67ef59 (diff)
downloadOneRoll-6f499de159eeac37fe473f945042e13359dc2d40.tar.gz
OneRoll-6f499de159eeac37fe473f945042e13359dc2d40.zip
move files
Diffstat (limited to 'include')
-rw-r--r--include/dicealias.h119
-rw-r--r--include/diceparser.h362
-rw-r--r--include/diceparserhelper.h4
-rw-r--r--include/highlightdice.h55
-rw-r--r--include/parsingtoolbox.h247
5 files changed, 787 insertions, 0 deletions
diff --git a/include/dicealias.h b/include/dicealias.h
new file mode 100644
index 0000000..463a654
--- /dev/null
+++ b/include/dicealias.h
@@ -0,0 +1,119 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * This file is part of DiceParser *
+ * *
+ * DiceParser is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef DICEALIAS_H
+#define DICEALIAS_H
+
+#include <QString>
+/**
+ * @brief The DiceAlias class is dedicated to store aliases, alias is mainly two QString. The Alias and its replacement.
+ * The replacement can be a simple QString or a RegExp.
+ */
+class DiceAlias
+{
+public:
+ enum RESOLUTION_TYPE
+ {
+ REPLACE,
+ REGEXP
+ };
+ /**
+ * @brief DiceAlias
+ * @param cmd
+ * @param key
+ * @param isReplace
+ */
+ DiceAlias(QString pattern, QString remplacement, bool isReplace= true, bool isEnable= true);
+ /**
+ * @brief ~DiceAlias
+ */
+ virtual ~DiceAlias();
+ /**
+ * @brief resolved
+ * @param str
+ * @return
+ */
+ bool resolved(QString& str);
+ /**
+ * @brief setCommand
+ * @param key
+ */
+ void setCommand(QString key);
+ /**
+ * @brief setValue
+ * @param value
+ */
+ void setValue(QString value);
+ /**
+ * @brief setType
+ */
+ void setType(RESOLUTION_TYPE);
+
+ /**
+ * @brief getCommand
+ * @return
+ */
+ QString getCommand() const;
+ /**
+ * @brief getValue
+ * @return
+ */
+ QString getValue() const;
+ /**
+ * @brief isReplace
+ * @return
+ */
+ bool isReplace() const;
+ /**
+ * @brief setReplace
+ */
+ void setReplace(bool);
+
+ /**
+ * @brief isEnable
+ * @return
+ */
+ bool isEnable() const;
+ /**
+ * @brief setEnable
+ * @param b
+ */
+ void setEnable(bool b);
+ /**
+ * @brief getComment
+ * @return
+ */
+ QString getComment() const;
+ /**
+ * @brief setComment
+ * @param comment
+ */
+ void setComment(const QString& comment);
+
+private:
+ QString m_command;
+ QString m_value;
+ QString m_comment;
+ RESOLUTION_TYPE m_type;
+ bool m_isEnable;
+};
+
+#endif // DICEALIAS_H
diff --git a/include/diceparser.h b/include/diceparser.h
new file mode 100644
index 0000000..8ecfb50
--- /dev/null
+++ b/include/diceparser.h
@@ -0,0 +1,362 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * This file is part of DiceParser *
+ * *
+ * DiceParser is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef DICEPARSER_H
+#define DICEPARSER_H
+
+#include <QMap>
+#include <QString>
+
+#include "dicealias.h"
+#include "highlightdice.h"
+#include "node/executionnode.h"
+
+typedef QList<HighLightDice> ListDiceResult;
+typedef QMap<quint64, ListDiceResult> ExportedDiceResult;
+
+class ExplodeDiceNode;
+class ParsingToolBox;
+class DiceRollerNode;
+/**
+ * @page DiceParser Dice Parser
+ *
+ * @section Intro Introduction
+ * Diceparser is the software component dedicated to compute dice command in rolisteam.<br/>
+ *
+ * @section grammar The Grammar
+ *
+ * The grammar is described in Readme.md
+ */
+
+/**
+ * @brief The DiceParser class facade class, it receives a command and return a DiceResult class (not yet implemented).
+ */
+class DiceParser
+{
+public:
+ /**
+ * @brief The DiceOperator enum gathering all dice operators
+ */
+ enum DiceOperator
+ {
+ D,
+ L
+ };
+ /**
+ * @brief The DiceSymbol enum
+ */
+ enum NodeAction
+ {
+ JumpBackward
+ };
+ /**
+ * @brief The OptionOperator enum gathering all options availables for result.
+ */
+ enum OptionOperator
+ {
+ KeepAndExplode,
+ Keep,
+ Reroll,
+ RerollUntil,
+ Explode,
+ Sort,
+ Count,
+ RerollAndAdd,
+ Merge,
+ ifOperator,
+ Painter,
+ Filter,
+ Split,
+ Group,
+ Occurences,
+ Unique,
+ Bind
+ };
+ /**
+ * @brief The CommandOperator enum
+ */
+ enum CommandOperator
+ {
+ };
+
+ /**
+ * @brief DiceParser default constructor
+ */
+ DiceParser();
+ /**
+ * @brief ~DiceParser
+ */
+ virtual ~DiceParser();
+
+ /**
+ * @brief parseLine, method to call for starting the dice roll. It will parse the command and run the execution
+ * tree.
+ * @param str dice command
+ * @return bool every thing is fine or not
+ */
+ bool parseLine(QString str, bool allowAlias= true);
+ /**
+ * @brief getStartNodeCount
+ * @return
+ */
+ int getStartNodeCount() const;
+ /**
+ * @brief Start running the execution tree
+ *
+ */
+ void start();
+
+ /**
+ * @brief displayResult
+ */
+ QString displayResult();
+ /**
+ * @brief readExpression
+ * @param str
+ * @param node
+ * @return
+ */
+ bool readExpression(QString& str, ExecutionNode*& node);
+ /**
+ * @brief displayDotTree - Write the execution tree into file using dot format.
+ * @param filepath absolute or relative path to the tree file.
+ */
+ void writeDownDotTree(QString filepath);
+ /**
+ * @brief getLastIntegerResults
+ * @return
+ */
+ QList<qreal> getLastIntegerResults();
+ /**
+ * @brief getSumOfDiceResult
+ * @return
+ */
+ QList<qreal> getSumOfDiceResult();
+ /**
+ * @brief getLastDiceResult
+ * @return
+ */
+ void getLastDiceResult(QList<ExportedDiceResult>& diceValues, bool& homogeneous);
+ /**
+ * @brief hasIntegerResultNotInFirst
+ * @return
+ */
+ bool hasIntegerResultNotInFirst();
+ /**
+ * @brief hasDiceResult
+ * @return
+ */
+ bool hasDiceResult();
+ /**
+ * @brief getDiceCommand
+ * @return
+ */
+ QString getDiceCommand() const;
+ /**
+ * @brief hasStringResult
+ * @return
+ */
+ bool hasStringResult();
+ /**
+ * @brief getStringResult
+ * @return
+ */
+ QStringList getStringResult();
+ /**
+ * @brief humanReadableError
+ * @return
+ */
+ QString humanReadableError();
+ /**
+ * @brief getAliases
+ * @return
+ */
+ QList<DiceAlias*>* getAliases();
+ /**
+ * @brief insertAlias
+ */
+ void insertAlias(DiceAlias*, int);
+ /**
+ * @brief DiceParser::convertAlias
+ * @param str
+ * @return
+ */
+ QString convertAlias(QString str);
+ /**
+ * @brief getErrorList
+ * @return
+ */
+ QMap<ExecutionNode::DICE_ERROR_CODE, QString> getErrorMap();
+ /**
+ * @brief setPathToHelp set the path to the documentation, this path must be adatped to the lang of application etc…
+ * @param l the path.
+ */
+ void setPathToHelp(QString l);
+ /**
+ * @brief getAllStringResult
+ * @return
+ */
+ QStringList getAllStringResult(bool& hasAlias);
+ /**
+ * @brief getAllDiceResult
+ * @param hasAlias
+ * @return
+ */
+ QStringList getAllDiceResult(bool& hasAlias);
+ /**
+ * @brief hasSeparator allows to know if the current command has separator.
+ * @return true when the command has separator, false otherwise.
+ */
+ bool hasSeparator() const;
+ /**
+ * @brief readIfInstruction reads the current command to build if node with proper parameters.
+ * @param str is the command string, if IF istruction is found, the str will be changed, in other case the string is
+ * unmodified
+ * @param trueNode is the branch's beginning to be executed if the IfNode is true.
+ * @param falseNode is the branch's beginning to be executed if the IfNode is false.
+ * @return true, ifNode has been found, false otherwise
+ */
+ bool readIfInstruction(QString& str, ExecutionNode*& trueNode, ExecutionNode*& falseNode);
+ /**
+ * @brief setVariableDictionary
+ * @param variables
+ */
+ void setVariableDictionary(const QHash<QString, QString>& variables);
+ QString getComment() const;
+ void setComment(const QString& comment);
+
+ bool readOptionFromNull(QString& str, ExecutionNode*& node);
+ bool readOperatorFromNull(QString& str, ExecutionNode*& node);
+
+ bool readInstructionList(QString& str);
+ void getDiceResultFromAllInstruction(QList<ExportedDiceResult>& resultList);
+ QString humanReadableWarning();
+
+ bool readValuesList(QString& str, ExecutionNode*& node);
+
+protected:
+ bool readParameterNode(QString& str, ExecutionNode*& node);
+
+private:
+ /**
+ * @brief readDice
+ * @param str
+ * @return
+ */
+ bool readDice(QString& str, ExecutionNode*& node);
+ /**
+ * @brief readDiceOperator
+ * @return
+ */
+ bool readDiceOperator(QString&, DiceOperator&);
+ /**
+ * @brief readDiceExpression
+ * @param node
+ * @return
+ */
+ bool readDiceExpression(QString&, ExecutionNode*& node);
+ /**
+ * @brief readOperator
+ * @return
+ */
+ bool readOperator(QString&, ExecutionNode* previous);
+ /**
+ * @brief DiceParser::readCommand
+ * @param str
+ * @param node
+ * @return
+ */
+ bool readCommand(QString& str, ExecutionNode*& node);
+
+ /**
+ * @brief readOption
+ */
+ bool readOption(QString&, ExecutionNode* node); // OptionOperator& option,
+
+ /**
+ * @brief addRollDiceNode
+ * @param faces
+ * @return
+ */
+ DiceRollerNode* addRollDiceNode(qint64 faces, ExecutionNode*);
+ /**
+ * @brief addExplodeDiceNode
+ * @param faces
+ * @param previous
+ * @return
+ */
+ ExplodeDiceNode* addExplodeDiceNode(qint64 faces, ExecutionNode* previous);
+ /**
+ * @brief readOperand
+ * @param node
+ * @return
+ */
+ bool readOperand(QString&, ExecutionNode*& node);
+
+ /**
+ * @brief readInstructionOperator
+ * @param c
+ * @return
+ */
+ bool readInstructionOperator(QChar c);
+ /**
+ * @brief readNode
+ * @param str
+ * @param node
+ * @return
+ */
+ bool readNode(QString& str, ExecutionNode*& node);
+
+ /**
+ * @brief getLeafNode
+ * @return
+ */
+ ExecutionNode* getLeafNode(ExecutionNode* node);
+
+ /**
+ * @brief hasResultOfType
+ * @param notthelast
+ * @return
+ */
+ bool hasResultOfType(Result::RESULT_TYPE, ExecutionNode* node, bool notthelast= false);
+
+private:
+ QMap<QString, DiceOperator>* m_mapDiceOp;
+ QMap<QString, OptionOperator>* m_OptionOp;
+ QMap<QString, NodeAction>* m_nodeActionMap;
+ QList<DiceAlias*>* m_aliasList;
+ QStringList* m_commandList;
+
+ QMap<ExecutionNode::DICE_ERROR_CODE, QString> m_errorMap;
+ QMap<ExecutionNode::DICE_ERROR_CODE, QString> m_warningMap;
+
+ ExecutionNode* m_start= nullptr;
+ std::vector<ExecutionNode*> m_startNodes;
+ // ExecutionNode* m_current;
+ QString m_command;
+ ParsingToolBox* m_parsingToolbox;
+ QString m_helpPath;
+ bool m_currentTreeHasSeparator;
+ bool readBlocInstruction(QString& str, ExecutionNode*& resultnode);
+ QString m_comment;
+};
+
+#endif // DICEPARSER_H
diff --git a/include/diceparserhelper.h b/include/diceparserhelper.h
new file mode 100644
index 0000000..4f53293
--- /dev/null
+++ b/include/diceparserhelper.h
@@ -0,0 +1,4 @@
+#ifndef DICEPARSERHELPER_H
+#define DICEPARSERHELPER_H
+
+#endif // DICEPARSERHELPER_H
diff --git a/include/highlightdice.h b/include/highlightdice.h
new file mode 100644
index 0000000..2e8f08a
--- /dev/null
+++ b/include/highlightdice.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2016 by Renaud Guezennec *
+ * http:://www.rolisteam.org/contact *
+ * *
+ * rolisteam is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef HighLightDice_H
+#define HighLightDice_H
+
+#include <QList>
+#include <QString>
+
+class HighLightDice
+{
+public:
+ HighLightDice(QList<qint64> result, bool isHighlighted, QString color, bool displayed, quint64 faces);
+ virtual ~HighLightDice();
+
+ QList<qint64> getResult() const;
+ void setResult(const QList<qint64>& result);
+
+ bool isHighlighted() const;
+ void setHighlight(bool hasHighlight);
+
+ QString getColor() const;
+ void setColor(const QString& color);
+
+ bool getDisplayed() const;
+ void setDisplayed(bool displayed);
+
+ quint64 getFaces() const;
+ void setFaces(const quint64& faces);
+
+private:
+ QList<qint64> m_result;
+ bool m_hasHighlight= true;
+ QString m_color;
+ bool m_displayed= false;
+ quint64 m_faces;
+};
+
+#endif // HighLightDice_H
diff --git a/include/parsingtoolbox.h b/include/parsingtoolbox.h
new file mode 100644
index 0000000..b91db1a
--- /dev/null
+++ b/include/parsingtoolbox.h
@@ -0,0 +1,247 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * This file is part of DiceParser *
+ * *
+ * DiceParser is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef PARSINGTOOLBOX_H
+#define PARSINGTOOLBOX_H
+
+#include <QMap>
+
+#include "booleancondition.h"
+#include "compositevalidator.h"
+#include "node/dicerollernode.h"
+#include "node/executionnode.h"
+#include "node/ifnode.h"
+#include "node/paintnode.h"
+#include "node/scalaroperatornode.h"
+#include "operationcondition.h"
+#include "range.h"
+
+class SubtituteInfo
+{
+public:
+ SubtituteInfo();
+
+ bool isValid() const;
+
+ int length() const;
+ void setLength(int length);
+
+ int resultIndex() const;
+ void setResultIndex(int valueIndex);
+
+ int position() const;
+ void setPosition(int position);
+
+ int digitNumber() const;
+ void setDigitNumber(int digitNumber);
+
+private:
+ int m_length= 2;
+ int m_digitNumber= 0;
+ int m_resultIndex= -1;
+ int m_position= -1;
+};
+
+/**
+ * @brief The ParsingToolBox is gathering many useful methods for dice parsing.
+ * Its goal is to make the diceparser a bit lighter.
+ */
+class ParsingToolBox
+{
+public:
+ enum LIST_OPERATOR
+ {
+ NONE,
+ UNIQUE
+ };
+
+ /**
+ * @brief ParsingToolBox
+ */
+ ParsingToolBox();
+ /**
+ * @brief ParsingToolBox
+ * @param data
+ */
+ ParsingToolBox(const ParsingToolBox& data);
+ /**
+ * @brief ~ParsingToolBox
+ */
+ virtual ~ParsingToolBox();
+ /**
+ * @brief addSort
+ * @param e
+ * @param b
+ * @return
+ */
+ ExecutionNode* addSort(ExecutionNode* e, bool b);
+ /**
+ * @brief readAscending
+ * @param str
+ * @return
+ */
+ static bool readAscending(QString& str);
+ /**
+ * @brief readLogicOperator
+ * @param str
+ * @param op
+ * @return
+ */
+ bool readLogicOperator(QString& str, BooleanCondition::LogicOperator& op);
+ /**
+ * @brief readValidator
+ * @param str
+ * @return
+ */
+ Validator* readValidator(QString& str, bool hasSquare=false);
+ /**
+ * @brief readCompositeValidator
+ * @param str
+ * @return
+ */
+ Validator* readCompositeValidator(QString& str);
+
+ /**
+ * @brief readNumber read number in the given str and remove from the string the read character.
+ * @param str the command line
+ * @param myNumber reference to the found number
+ * @return true, succeed to read number, false otherwise.
+ */
+ static bool readNumber(QString& str, qint64& myNumber);
+
+ /**
+ * @brief readString
+ * @param str
+ * @param strResult
+ * @return
+ */
+ static bool readString(QString& str, QString& strresult);
+ /**
+ * @brief readVariable
+ * @param str
+ * @param myNumber
+ * @return
+ */
+ static bool readVariable(QString& str, qint64& myNumber, QString& reasonFail);
+ /**
+ * @brief readOpenParentheses
+ * @param str
+ * @return
+ */
+ static bool readOpenParentheses(QString& str);
+ /**
+ * @brief readCloseParentheses
+ * @param str
+ * @return
+ */
+ static bool readCloseParentheses(QString& str);
+
+ /**
+ * @brief readNumber read number in the given str and remove from the string the read character.
+ * @param str the command line
+ * @param myNumber reference to the found number
+ * @return true, succeed to read number, false otherwise.
+ */
+ static bool readDynamicVariable(QString& str, qint64& index);
+
+ /**
+ * @brief readList
+ * @param str
+ * @param list
+ * @return
+ */
+ bool readList(QString& str, QStringList& list, QList<Range>& ranges);
+ /**
+ * @brief isValidValidator
+ * @param previous
+ * @param val
+ * @return
+ */
+ bool isValidValidator(ExecutionNode* previous, Validator* val);
+ /**
+ * @brief getDiceRollerNode
+ * @param previous
+ * @return
+ */
+ DiceRollerNode* getDiceRollerNode(ExecutionNode* previous);
+
+ /**
+ * @brief readDiceRange
+ * @param str
+ * @param start
+ * @param end
+ * @return
+ */
+ bool readDiceRange(QString& str, qint64& start, qint64& end);
+ /**
+ * @brief readListOperator
+ * @param str
+ * @return
+ */
+ static LIST_OPERATOR readListOperator(QString& str);
+
+ void readProbability(QStringList& str, QList<Range>& ranges);
+
+ bool readLogicOperation(QString& str, CompositeValidator::LogicOperation& op);
+
+ bool readDiceLogicOperator(QString& str, OperationCondition::ConditionOperator& op);
+
+ bool readArithmeticOperator(QString& str, Die::ArithmeticOperator& op);
+
+ static void readPainterParameter(PainterNode* painter, QString& str);
+
+ static QHash<QString, QString> getVariableHash();
+ static void setVariableHash(const QHash<QString, QString>& variableHash);
+ /**
+ * @brief readConditionType
+ * @param str
+ * @return
+ */
+ static IfNode::ConditionType readConditionType(QString& str);
+
+ bool readComment(QString& str, QString&, QString&);
+ static ExecutionNode* getLatestNode(ExecutionNode* node);
+
+ static std::vector<ExecutionNode*>* getStartNodes();
+ static void setStartNodes(std::vector<ExecutionNode*>* startNodes);
+
+ static bool readOperand(QString& str, ExecutionNode*& node);
+ static int findClosingCharacterIndexOf(QChar open, QChar closing, const QString& str, int offset);
+
+ static QString replaceVariableToValue(const QString& source, QStringList values);
+
+ static SubtituteInfo readVariableFromString(const QString& source, int& start);
+
+ static void readSubtitutionParameters(SubtituteInfo& info, QString& rest);
+
+ static bool readComma(QString& str);
+
+private:
+ QMap<QString, BooleanCondition::LogicOperator>* m_logicOp;
+ QMap<QString, CompositeValidator::LogicOperation>* m_logicOperation;
+ QMap<QString, OperationCondition::ConditionOperator>* m_conditionOperation;
+ QHash<QString, Die::ArithmeticOperator>* m_arithmeticOperation;
+
+ static QHash<QString, QString> m_variableHash;
+ static std::vector<ExecutionNode*>* m_startNodes;
+};
+
+#endif // PARSINGTOOLBOX_H