From 6ba9324cf4864ebd2e2cdec8098b0889ceaea0a8 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Sat, 16 Apr 2022 01:58:40 +0200 Subject: Make sure Windows compilation works --- include/dicealias.h | 120 --------- include/diceparser.h | 129 ---------- include/diceparser/dicealias.h | 122 +++++++++ include/diceparser/diceparser.h | 130 ++++++++++ include/diceparser/diceparser_global.h | 11 + include/diceparser/diceparserhelper.h | 96 +++++++ include/diceparser/highlightdice.h | 68 +++++ include/diceparser/parsingtoolbox.h | 284 +++++++++++++++++++++ .../diceparser_qobject/diceparser_qobject_global.h | 11 + include/diceparser_qobject/diceroller.h | 74 ++++++ include/diceparser_qobject/qmltypesregister.h | 27 ++ include/diceparserhelper.h | 63 ----- include/highlightdice.h | 66 ----- include/parsingtoolbox.h | 274 -------------------- 14 files changed, 823 insertions(+), 652 deletions(-) delete mode 100644 include/dicealias.h delete mode 100644 include/diceparser.h create mode 100644 include/diceparser/dicealias.h create mode 100644 include/diceparser/diceparser.h create mode 100644 include/diceparser/diceparser_global.h create mode 100644 include/diceparser/diceparserhelper.h create mode 100644 include/diceparser/highlightdice.h create mode 100644 include/diceparser/parsingtoolbox.h create mode 100644 include/diceparser_qobject/diceparser_qobject_global.h create mode 100644 include/diceparser_qobject/diceroller.h create mode 100644 include/diceparser_qobject/qmltypesregister.h delete mode 100644 include/diceparserhelper.h delete mode 100644 include/highlightdice.h delete mode 100644 include/parsingtoolbox.h (limited to 'include') diff --git a/include/dicealias.h b/include/dicealias.h deleted file mode 100644 index c390d21..0000000 --- a/include/dicealias.h +++ /dev/null @@ -1,120 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2014 by Renaud Guezennec * - * https://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 -/** - * @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 command, QString comment= QString{}, bool isReplace= true, bool isEnable= true); - DiceAlias(const DiceAlias& alias); - /** - * @brief ~DiceAlias - */ - virtual ~DiceAlias(); - /** - * @brief resolved - * @param str - * @return - */ - bool resolved(QString& str); - /** - * @brief setCommand - * @param key - */ - void setPattern(const QString& pattern); - /** - * @brief setValue - * @param value - */ - void setCommand(QString command); - /** - * @brief setType - */ - void setType(RESOLUTION_TYPE); - - /** - * @brief getCommand - * @return - */ - QString pattern() const; - /** - * @brief getValue - * @return - */ - QString command() 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 comment() const; - /** - * @brief setComment - * @param comment - */ - void setComment(const QString& comment); - -private: - QString m_pattern; - QString m_command; - QString m_comment; - RESOLUTION_TYPE m_type; - bool m_isEnable; -}; - -#endif // DICEALIAS_H diff --git a/include/diceparser.h b/include/diceparser.h deleted file mode 100644 index 3c42bcc..0000000 --- a/include/diceparser.h +++ /dev/null @@ -1,129 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2014 by Renaud Guezennec * - * https://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 -#include -#include -#include -#include -#include - -#include "diceparserhelper.h" -#include "highlightdice.h" -//#include "node/executionnode.h" - -class ExplodeDiceNode; -class ParsingToolBox; -class DiceRollerNode; -class DiceAlias; -class ExecutionNode; -/** - * @page DiceParser Dice Parser - * - * @section Intro Introduction - * Diceparser is the software component dedicated to compute dice command in rolisteam.
- * - * @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 DiceParser default constructor - */ - DiceParser(); - /** - * @brief ~DiceParser - */ - virtual ~DiceParser(); - - // Command process methods - /** - * @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); - void start(); - void cleanAll(); - - // debug - void writeDownDotTree(QString filepath); - - // control methods - bool hasIntegerResultNotInFirst() const; - bool hasDiceResult() const; - bool hasStringResult() const; - bool hasSeparator() const; - - // alias management - const QList& constAliases() const; - QList* aliases() const; - void cleanAliases(); - void insertAlias(DiceAlias*, int); - QString convertAlias(const QString& cmd) const; - - QStringList allFirstResultAsString(bool& hasAlias); - QStringList getAllDiceResult(bool& hasAlias); - - // Accessors - int startNodeCount() const; - QList scalarResultsFromEachInstruction() const; - QStringList stringResultFromEachInstruction(bool& hasAlias) const; - void diceResultFromEachInstruction(QList& resultList) const; - QString finalStringResult(std::function colorize) const; - - QString diceCommand() const; - QMap errorMap() const; - QString comment() const; - QString humanReadableWarning() const; - QString humanReadableError() const; - QString resultAsJSon(std::function colorize, - bool removeUnhighligthed= false) const; - - // QStringList stringResult() const; - // QStringList allDiceResult(bool& hasAlias) const; - // void lastDiceResult(QList& diceValues, bool& homogeneous) const; - - // setters - void setPathToHelp(QString l); - void setVariableDictionary(const QHash& variables); - void setComment(const QString& comment); - -private: - bool readBlocInstruction(QString& str, ExecutionNode*& resultnode); - -private: - std::unique_ptr m_parsingToolbox; - QString m_command; -}; - -#endif // DICEPARSER_H diff --git a/include/diceparser/dicealias.h b/include/diceparser/dicealias.h new file mode 100644 index 0000000..05d5a0b --- /dev/null +++ b/include/diceparser/dicealias.h @@ -0,0 +1,122 @@ +/*************************************************************************** + * Copyright (C) 2014 by Renaud Guezennec * + * https://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 + +#include +/** + * @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 DICEPARSER_EXPORT DiceAlias +{ +public: + enum RESOLUTION_TYPE + { + REPLACE, + REGEXP + }; + /** + * @brief DiceAlias + * @param cmd + * @param key + * @param isReplace + */ + DiceAlias(QString pattern, QString command, QString comment= QString{}, bool isReplace= true, bool isEnable= true); + DiceAlias(const DiceAlias& alias); + /** + * @brief ~DiceAlias + */ + virtual ~DiceAlias(); + /** + * @brief resolved + * @param str + * @return + */ + bool resolved(QString& str); + /** + * @brief setCommand + * @param key + */ + void setPattern(const QString& pattern); + /** + * @brief setValue + * @param value + */ + void setCommand(QString command); + /** + * @brief setType + */ + void setType(RESOLUTION_TYPE); + + /** + * @brief getCommand + * @return + */ + QString pattern() const; + /** + * @brief getValue + * @return + */ + QString command() 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 comment() const; + /** + * @brief setComment + * @param comment + */ + void setComment(const QString& comment); + +private: + QString m_pattern; + QString m_command; + QString m_comment; + RESOLUTION_TYPE m_type; + bool m_isEnable; +}; + +#endif // DICEALIAS_H diff --git a/include/diceparser/diceparser.h b/include/diceparser/diceparser.h new file mode 100644 index 0000000..bf2d570 --- /dev/null +++ b/include/diceparser/diceparser.h @@ -0,0 +1,130 @@ +/*************************************************************************** + * Copyright (C) 2014 by Renaud Guezennec * + * https://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 +#include +#include +#include +#include +#include + +#include + +#include +#include + +class ExplodeDiceNode; +class ParsingToolBox; +class DiceRollerNode; +class DiceAlias; +class ExecutionNode; +/** + * @page DiceParser Dice Parser + * + * @section Intro Introduction + * Diceparser is the software component dedicated to compute dice command in rolisteam.
+ * + * @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_EXPORT DiceParser +{ +public: + /** + * @brief DiceParser default constructor + */ + DiceParser(); + /** + * @brief ~DiceParser + */ + virtual ~DiceParser(); + + // Command process methods + /** + * @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); + void start(); + void cleanAll(); + + // debug + void writeDownDotTree(QString filepath); + + // control methods + bool hasIntegerResultNotInFirst() const; + bool hasDiceResult() const; + bool hasStringResult() const; + bool hasSeparator() const; + + // alias management + const QList& constAliases() const; + QList* aliases() const; + void cleanAliases(); + void insertAlias(DiceAlias*, int); + QString convertAlias(const QString& cmd) const; + + QStringList allFirstResultAsString(bool& hasAlias); + QStringList getAllDiceResult(bool& hasAlias); + + // Accessors + int startNodeCount() const; + QList scalarResultsFromEachInstruction() const; + QStringList stringResultFromEachInstruction(bool& hasAlias) const; + void diceResultFromEachInstruction(QList& resultList) const; + QString finalStringResult(std::function colorize) const; + + QString diceCommand() const; + QMap errorMap() const; + QString comment() const; + QString humanReadableWarning() const; + QString humanReadableError() const; + QString resultAsJSon(std::function colorize, + bool removeUnhighligthed= false) const; + + // QStringList stringResult() const; + // QStringList allDiceResult(bool& hasAlias) const; + // void lastDiceResult(QList& diceValues, bool& homogeneous) const; + + // setters + void setPathToHelp(QString l); + void setVariableDictionary(const QHash& variables); + void setComment(const QString& comment); + +private: + bool readBlocInstruction(QString& str, ExecutionNode*& resultnode); + +private: + std::unique_ptr m_parsingToolbox; + QString m_command; +}; + +#endif // DICEPARSER_H diff --git a/include/diceparser/diceparser_global.h b/include/diceparser/diceparser_global.h new file mode 100644 index 0000000..47829cc --- /dev/null +++ b/include/diceparser/diceparser_global.h @@ -0,0 +1,11 @@ +#ifndef DICEPARSER_GLOBAL_H +#define DICEPARSER_GLOBAL_H + +#include + +#if defined(DICEPARSER_LIBRARY) +#define DICEPARSER_EXPORT Q_DECL_EXPORT +#else +#define DICEPARSER_EXPORT Q_DECL_IMPORT +#endif +#endif // DICEPARSER_GLOBAL_H diff --git a/include/diceparser/diceparserhelper.h b/include/diceparser/diceparserhelper.h new file mode 100644 index 0000000..6190df2 --- /dev/null +++ b/include/diceparser/diceparserhelper.h @@ -0,0 +1,96 @@ +#ifndef DICEPARSERHELPER_H +#define DICEPARSERHELPER_H + +class ValidatorList; +class ExecutionNode; + +#include + +namespace Dice +{ +enum class CONDITION_STATE : int +{ + ERROR_STATE, + ALWAYSTRUE, + UNREACHABLE, + REACHABLE +}; + +enum class ERROR_CODE : int +{ + NO_DICE_ERROR, + DIE_RESULT_EXPECTED, + BAD_SYNTAXE, + ENDLESS_LOOP_ERROR, + DIVIDE_BY_ZERO, + NOTHING_UNDERSTOOD, + NO_DICE_TO_ROLL, + TOO_MANY_DICE, + NO_VARIBALE, + INVALID_INDEX, + UNEXPECTED_CHARACTER, + NO_PREVIOUS_ERROR, + NO_VALID_RESULT, + SCALAR_RESULT_EXPECTED +}; + +/** + * @brief The RESULT_TYPE enum or combinaison + */ +enum class RESULT_TYPE : int +{ + NONE= 0, + SCALAR= 1, + STRING= 2, + DICE_LIST= 4 +}; +/** + * @brief The ConditionType enum defines compare method + */ +enum ConditionType +{ + OnEach, + OnEachValue, + OneOfThem, + AllOfThem, + OnScalar +}; + +enum class CompareOperator +{ + Equal, + GreaterThan, + LesserThan, + GreaterOrEqual, + LesserOrEqual, + Different +}; +enum class ArithmeticOperator +{ + PLUS, + MINUS, + DIVIDE, + MULTIPLICATION, + INTEGER_DIVIDE, + POW +}; +enum class LogicOperation +{ + OR, + EXCLUSIVE_OR, + AND, + NONE +}; + +enum class ConditionOperator +{ + Modulo +}; + +struct DICEPARSER_EXPORT CaseInfo +{ + ValidatorList* validatorList; + ExecutionNode* node; +}; +} // namespace Dice +#endif // DICEPARSERHELPER_H diff --git a/include/diceparser/highlightdice.h b/include/diceparser/highlightdice.h new file mode 100644 index 0000000..a3928a1 --- /dev/null +++ b/include/diceparser/highlightdice.h @@ -0,0 +1,68 @@ +/*************************************************************************** + * 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 +#include +#include + +#include + +class DICEPARSER_EXPORT HighLightDice +{ +public: + HighLightDice(QList result, bool isHighlighted, QString color, bool displayed, quint64 faces, + const QString& uuid); + virtual ~HighLightDice(); + + QList result() const; + void setResult(const QList& result); + + bool isHighlighted() const; + void setHighlight(bool hasHighlight); + + QString color() const; + void setColor(const QString& color); + + bool displayed() const; + void setDisplayed(bool displayed); + + quint64 faces() const; + void setFaces(const quint64& faces); + + QString getResultString() const; + + QString uuid() const; + void setUuid(const QString& uuid); + +private: + QList m_result; + bool m_hasHighlight= true; + QString m_color; + bool m_displayed= false; + quint64 m_faces; + QString m_uuid; +}; + +typedef QList ListDiceResult; +typedef QMap> ExportedDiceResult; + +#endif // HighLightDice_H diff --git a/include/diceparser/parsingtoolbox.h b/include/diceparser/parsingtoolbox.h new file mode 100644 index 0000000..69f433a --- /dev/null +++ b/include/diceparser/parsingtoolbox.h @@ -0,0 +1,284 @@ +/*************************************************************************** + * Copyright (C) 2014 by Renaud Guezennec * + * https://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 +#include +#include +#include +#include +#include +#include + +#include "diceparserhelper.h" +#include "highlightdice.h" +//#include "dicerollernode.h" +//#include "executionnode.h" +//#include "node/ifnode.h" +//#include "node/paintnode.h" +//#include "node/scalaroperatornode.h" +//#include "operationcondition.h" +//#include "range.h" +//#include "validatorlist.h" + +#include +class Range; +class RepeaterNode; +class DiceAlias; +class ExplodeDiceNode; +class SwitchCaseNode; +class ReplaceValueNode; +class PainterNode; +class ValidatorList; +class Validator; +class DiceRollerNode; +class ExecutionNode; +class DICEPARSER_EXPORT 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); + + int subIndex() const; + void setSubIndex(int subindex); + +private: + int m_length= 2; + int m_digitNumber= 0; + int m_resultIndex= -1; + int m_position= -1; + int m_subIndex= -1; +}; + +/** + * @brief The ParsingToolBox is gathering many useful methods for dice parsing. + * Its goal is to make the diceparser a bit lighter. + */ +class DICEPARSER_EXPORT ParsingToolBox +{ +public: + enum LIST_OPERATOR + { + NONE= 0x00, + UNIQUE= 0x01, + NOCOMMA= 0x02, + UniqueAndNoComma= 0x03 + }; + + enum Function + { + REPEAT + }; + enum OptionOperator + { + KeepAndExplode, // K + Keep, // k + Reroll, // r + RerollUntil, // R + Explode, // e + Sort, // s + Count, // c + RerollAndAdd, // a + Merge, // m + ifOperator, // i + Painter, // p + Filter, // f + Split, // y + Group, // g + Occurences, // o + Unique, // u + Bind, // b + AllSameExplode, // t + SwitchCaseOption, // S + TransformOption // T + }; + enum DiceOperator + { + D, + L + }; + enum NodeAction + { + JumpBackward + }; + ParsingToolBox(); + ParsingToolBox(const ParsingToolBox& data); + virtual ~ParsingToolBox(); + void clearUp(); + + // Build execution tree + DiceRollerNode* getDiceRollerNode(ExecutionNode* previous); + DiceRollerNode* addRollDiceNode(qint64 faces, ExecutionNode*); + ExplodeDiceNode* addExplodeDiceNode(qint64 faces, ExecutionNode* previous); + Dice::CONDITION_STATE isValidValidator(ExecutionNode* previous, ValidatorList* val); + ExecutionNode* addSort(ExecutionNode* e, bool b); + + // parsing tools + static bool readAscending(QString& str); + static bool readStopAtFirst(QString& str); + bool readLogicOperator(QString& str, Dice::CompareOperator& op); + Validator* readValidator(QString& str, bool hasSquare= false); + ValidatorList* readValidatorList(QString& str); + static bool readNumber(QString& str, qint64& myNumber); + static bool readString(QString& str, QString& strresult); + static bool readVariable(QString& str, qint64& myNumber, QString& reasonFail); + static bool readOpenParentheses(QString& str); + static bool readCloseParentheses(QString& str); + + static bool readDynamicVariable(QString& str, qint64& index); + bool readList(QString& str, QStringList& list, QList& ranges); + bool readDiceRange(QString& str, qint64& start, qint64& end); + static LIST_OPERATOR readListOperator(QString& str); + void readProbability(QStringList& str, QList& ranges); + bool readLogicOperation(QString& str, Dice::LogicOperation& op); + bool readDiceLogicOperator(QString& str, Dice::ConditionOperator& op); + bool readArithmeticOperator(QString& str, Dice::ArithmeticOperator& op); + std::vector readInstructionList(QString& str, bool startNode); + static Dice::ConditionType readConditionType(QString& str); + bool readComment(QString& str, QString&, QString&); + bool readOperand(QString& str, ExecutionNode*& node); + static int findClosingCharacterIndexOf(QChar open, QChar closing, const QString& str, int offset); + static void readSubtitutionParameters(SubtituteInfo& info, QString& rest); + static bool readPainterParameter(PainterNode* painter, QString& str); + static bool readComma(QString& str); + bool readReaperArguments(RepeaterNode* node, QString& source); + bool readExpression(QString& str, ExecutionNode*& node); + bool readInstructionOperator(QChar c); + bool readNode(QString& str, ExecutionNode*& node); + /** + * @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); + bool readOptionFromNull(QString& str, ExecutionNode*& node); + bool readOperatorFromNull(QString& str, ExecutionNode*& node); + bool readParameterNode(QString& str, ExecutionNode*& node); + bool readFunction(QString& str, ExecutionNode*& node); + bool readDice(QString& str, ExecutionNode*& node); + bool readDiceOperator(QString&, DiceOperator&); + bool readDiceExpression(QString&, ExecutionNode*& node); + bool readOperator(QString&, ExecutionNode* previous); + bool readCommand(QString& str, ExecutionNode*& node); + bool readBlocInstruction(QString& str, ExecutionNode*& resultnode); + bool readOption(QString&, ExecutionNode* node); // OptionOperator& option, + bool readValuesList(QString& str, ExecutionNode*& node); + bool readSwitchCaseNode(QString& str, SwitchCaseNode* node); + bool readReplaceValueNode(QString& str, ReplaceValueNode* node); + + // Error + bool hasError() const; + void addError(Dice::ERROR_CODE code, const QString& msg); + void addWarning(Dice::ERROR_CODE code, const QString& msg); + const QMap& getErrorList() const; + const QMap& getWarningList() const; + + // Traversal functions + static QString number(qreal value); + static ExecutionNode* getLeafNode(ExecutionNode* start); + const std::vector& getStartNodes(); + static void setStartNodes(std::vector* startNodes); + std::pair hasResultOfType(Dice::RESULT_TYPE, ExecutionNode* node, bool notthelast= false) const; + QList scalarResultsFromEachInstruction() const; + std::pair finalScalarResult() const; + QString finalStringResult(std::function colorize, + bool removeUnhighlighted= false) const; + QStringList allFirstResultAsString(bool& hasAlias) const; + QList sumOfDiceResult() const; + QList diceResultFromEachInstruction() const; + bool hasIntegerResultNotInFirst() const; + bool hasDiceResult() const; + bool hasStringResult() const; + + // result + static QString replaceVariableToValue(const QString& source, QStringList values, + QMap& errorMap); + static QString replacePlaceHolderToValue(const QString& source, const QList& list, + bool removeUnhighlighted, + std::function colorize); + static SubtituteInfo readVariableFromString(const QString& source, int& start); + static SubtituteInfo readPlaceHolderFromString(const QString& source, int& start); + static ExportedDiceResult finalDiceResultFromInstruction(ExecutionNode* start); + static ExportedDiceResult allDiceResultFromInstruction(ExecutionNode* start); + void addResultInJson(QJsonObject& obj, Dice::RESULT_TYPE type, const QString& key, ExecutionNode* start, bool b); + void addDiceResultInJson(QJsonObject& obj, ExecutionNode* start, + std::function colorize); + + // accessors + void setComment(const QString& comment); + QString getComment() const; + void setHelpPath(const QString& path); + static QHash getVariableHash(); + static void setVariableHash(const QHash& variableHash); + void setStartNodes(std::vector nodes); + + // Aliases + QString convertAlias(QString str); + void insertAlias(DiceAlias* dice, int i); + const QList& getAliases() const; + QList* aliases(); + void setAliases(const QList list); + void cleanUpAliases(); + + static bool readStringResultParameter(QString& str); + static QString replacePlaceHolderFromJson(const QString& source, const QJsonObject& obj); + +private: + QMap m_logicOp; + QMap m_logicOperation; + QMap m_conditionOperation; + std::vector> m_arithmeticOperation; + QMap m_mapDiceOp; + QMap m_OptionOp; + QMap m_nodeActionMap; + std::map m_functionMap; + QStringList m_commandList; + + QMap m_errorMap; + QMap m_warningMap; + std::vector m_startNodes; + + QString m_comment; + + static QHash m_variableHash; + QString m_helpPath; + QList m_aliasList; +}; + +#endif // PARSINGTOOLBOX_H diff --git a/include/diceparser_qobject/diceparser_qobject_global.h b/include/diceparser_qobject/diceparser_qobject_global.h new file mode 100644 index 0000000..ea49727 --- /dev/null +++ b/include/diceparser_qobject/diceparser_qobject_global.h @@ -0,0 +1,11 @@ +#ifndef DICEPARSER_QOBJECT_GLOBAL_H +#define DICEPARSER_QOBJECT_GLOBAL_H + +#include + +#if defined(DICEPARSER_QOBJECT_LIBRARY) +#define DICEPARSER_QOBJECT_EXPORT Q_DECL_EXPORT +#else +#define DICEPARSER_QOBJECT_EXPORT Q_DECL_IMPORT +#endif +#endif // DICEPARSER_QOBJECT_GLOBAL_H diff --git a/include/diceparser_qobject/diceroller.h b/include/diceparser_qobject/diceroller.h new file mode 100644 index 0000000..72c4e10 --- /dev/null +++ b/include/diceparser_qobject/diceroller.h @@ -0,0 +1,74 @@ +/*************************************************************************** + * Copyright (C) 2017 by Renaud Guezennec * + * https://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 DICEROLLER_H +#define DICEROLLER_H + +#include +#include + +#include + +class DICEPARSER_QOBJECT_EXPORT DiceRoller : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal result READ result NOTIFY resultChanged) + Q_PROPERTY(QString dicelist READ diceList NOTIFY diceListChanged) + Q_PROPERTY(QString resultStr READ resultStr NOTIFY resultStrChanged) + Q_PROPERTY(QString command READ command WRITE setCommand NOTIFY commandChanged) + Q_PROPERTY(QString error READ error WRITE setError NOTIFY errorOccurs) + +public: + DiceRoller(QObject* parent= nullptr); + + QString diceList() const; + QString resultStr() const; + QString command() const; + qreal result() const; + QString error() const; + QList* aliases() const; + + DiceParser* parser(); + +signals: + void resultChanged(); + void diceListChanged(); + void resultStrChanged(); + void commandChanged(); + void errorOccurs(); + +public slots: + void start(); + void readErrorAndWarning(); + void setCommand(const QString& cmd); + void setError(const QString& error); + + /*protected: + QString diceToText(QList& diceList);*/ + +private: + DiceParser m_diceparser; + qreal m_result; + QString m_diceList; + QString m_resultStr; + QString m_command; + QString m_error; +}; + +#endif // DICEROLLER_H diff --git a/include/diceparser_qobject/qmltypesregister.h b/include/diceparser_qobject/qmltypesregister.h new file mode 100644 index 0000000..e0b1a09 --- /dev/null +++ b/include/diceparser_qobject/qmltypesregister.h @@ -0,0 +1,27 @@ +/*************************************************************************** + * Copyright (C) 2017 by Renaud Guezennec * + * https://rolisteam.org/contact * + * * + * This program 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 REGISTER_QML_TYPE_H +#define REGISTER_QML_TYPE_H + +#include + +DICEPARSER_QOBJECT_EXPORT void registerQmlTypes(); + +#endif // REGISTER_QML_TYPE_H diff --git a/include/diceparserhelper.h b/include/diceparserhelper.h deleted file mode 100644 index 1ae5c3f..0000000 --- a/include/diceparserhelper.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef DICEPARSERHELPER_H -#define DICEPARSERHELPER_H - -class ValidatorList; -class ExecutionNode; - -namespace Dice -{ -enum class CONDITION_STATE : int -{ - ERROR_STATE, - ALWAYSTRUE, - UNREACHABLE, - REACHABLE -}; - -enum class ERROR_CODE : int -{ - NO_DICE_ERROR, - DIE_RESULT_EXPECTED, - BAD_SYNTAXE, - ENDLESS_LOOP_ERROR, - DIVIDE_BY_ZERO, - NOTHING_UNDERSTOOD, - NO_DICE_TO_ROLL, - TOO_MANY_DICE, - NO_VARIBALE, - INVALID_INDEX, - UNEXPECTED_CHARACTER, - NO_PREVIOUS_ERROR, - NO_VALID_RESULT, - SCALAR_RESULT_EXPECTED -}; - -/** - * @brief The RESULT_TYPE enum or combinaison - */ -enum class RESULT_TYPE : int -{ - NONE= 0, - SCALAR= 1, - STRING= 2, - DICE_LIST= 4 -}; -/** - * @brief The ConditionType enum defines compare method - */ -enum ConditionType -{ - OnEach, - OnEachValue, - OneOfThem, - AllOfThem, - OnScalar -}; - -struct CaseInfo -{ - ValidatorList* validatorList; - ExecutionNode* node; -}; -} // namespace Dice -#endif // DICEPARSERHELPER_H diff --git a/include/highlightdice.h b/include/highlightdice.h deleted file mode 100644 index 66bd445..0000000 --- a/include/highlightdice.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - * 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 -#include -#include - -class HighLightDice -{ -public: - HighLightDice(QList result, bool isHighlighted, QString color, bool displayed, quint64 faces, - const QString& uuid); - virtual ~HighLightDice(); - - QList result() const; - void setResult(const QList& result); - - bool isHighlighted() const; - void setHighlight(bool hasHighlight); - - QString color() const; - void setColor(const QString& color); - - bool displayed() const; - void setDisplayed(bool displayed); - - quint64 faces() const; - void setFaces(const quint64& faces); - - QString getResultString() const; - - QString uuid() const; - void setUuid(const QString& uuid); - -private: - QList m_result; - bool m_hasHighlight= true; - QString m_color; - bool m_displayed= false; - quint64 m_faces; - QString m_uuid; -}; - -typedef QList ListDiceResult; -typedef QMap> ExportedDiceResult; - -#endif // HighLightDice_H diff --git a/include/parsingtoolbox.h b/include/parsingtoolbox.h deleted file mode 100644 index 08e876a..0000000 --- a/include/parsingtoolbox.h +++ /dev/null @@ -1,274 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2014 by Renaud Guezennec * - * https://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 -#include -#include - -#include "booleancondition.h" -#include "highlightdice.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" -#include "validatorlist.h" - -class RepeaterNode; -class DiceAlias; -class ExplodeDiceNode; -class SwitchCaseNode; -class ReplaceValueNode; - -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); - - int subIndex() const; - void setSubIndex(int subindex); - -private: - int m_length= 2; - int m_digitNumber= 0; - int m_resultIndex= -1; - int m_position= -1; - int m_subIndex= -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= 0x00, - UNIQUE= 0x01, - NOCOMMA= 0x02, - UniqueAndNoComma= 0x03 - }; - - enum Function - { - REPEAT - }; - enum OptionOperator - { - KeepAndExplode, // K - Keep, // k - Reroll, // r - RerollUntil, // R - Explode, // e - Sort, // s - Count, // c - RerollAndAdd, // a - Merge, // m - ifOperator, // i - Painter, // p - Filter, // f - Split, // y - Group, // g - Occurences, // o - Unique, // u - Bind, // b - AllSameExplode, // t - SwitchCaseOption, // S - TransformOption // T - }; - enum DiceOperator - { - D, - L - }; - enum NodeAction - { - JumpBackward - }; - ParsingToolBox(); - ParsingToolBox(const ParsingToolBox& data); - virtual ~ParsingToolBox(); - void clearUp(); - - // Build execution tree - DiceRollerNode* getDiceRollerNode(ExecutionNode* previous); - DiceRollerNode* addRollDiceNode(qint64 faces, ExecutionNode*); - ExplodeDiceNode* addExplodeDiceNode(qint64 faces, ExecutionNode* previous); - Dice::CONDITION_STATE isValidValidator(ExecutionNode* previous, ValidatorList* val); - ExecutionNode* addSort(ExecutionNode* e, bool b); - - // parsing tools - static bool readAscending(QString& str); - static bool readStopAtFirst(QString& str); - bool readLogicOperator(QString& str, BooleanCondition::LogicOperator& op); - Validator* readValidator(QString& str, bool hasSquare= false); - ValidatorList* readValidatorList(QString& str); - static bool readNumber(QString& str, qint64& myNumber); - static bool readString(QString& str, QString& strresult); - static bool readVariable(QString& str, qint64& myNumber, QString& reasonFail); - static bool readOpenParentheses(QString& str); - static bool readCloseParentheses(QString& str); - - static bool readDynamicVariable(QString& str, qint64& index); - bool readList(QString& str, QStringList& list, QList& ranges); - bool readDiceRange(QString& str, qint64& start, qint64& end); - static LIST_OPERATOR readListOperator(QString& str); - void readProbability(QStringList& str, QList& ranges); - bool readLogicOperation(QString& str, ValidatorList::LogicOperation& op); - bool readDiceLogicOperator(QString& str, OperationCondition::ConditionOperator& op); - bool readArithmeticOperator(QString& str, Die::ArithmeticOperator& op); - std::vector readInstructionList(QString& str, bool startNode); - static Dice::ConditionType readConditionType(QString& str); - bool readComment(QString& str, QString&, QString&); - bool readOperand(QString& str, ExecutionNode*& node); - static int findClosingCharacterIndexOf(QChar open, QChar closing, const QString& str, int offset); - static void readSubtitutionParameters(SubtituteInfo& info, QString& rest); - static bool readPainterParameter(PainterNode* painter, QString& str); - static bool readComma(QString& str); - bool readReaperArguments(RepeaterNode* node, QString& source); - bool readExpression(QString& str, ExecutionNode*& node); - bool readInstructionOperator(QChar c); - bool readNode(QString& str, ExecutionNode*& node); - /** - * @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); - bool readOptionFromNull(QString& str, ExecutionNode*& node); - bool readOperatorFromNull(QString& str, ExecutionNode*& node); - bool readParameterNode(QString& str, ExecutionNode*& node); - bool readFunction(QString& str, ExecutionNode*& node); - bool readDice(QString& str, ExecutionNode*& node); - bool readDiceOperator(QString&, DiceOperator&); - bool readDiceExpression(QString&, ExecutionNode*& node); - bool readOperator(QString&, ExecutionNode* previous); - bool readCommand(QString& str, ExecutionNode*& node); - bool readBlocInstruction(QString& str, ExecutionNode*& resultnode); - bool readOption(QString&, ExecutionNode* node); // OptionOperator& option, - bool readValuesList(QString& str, ExecutionNode*& node); - bool readSwitchCaseNode(QString& str, SwitchCaseNode* node); - bool readReplaceValueNode(QString& str, ReplaceValueNode* node); - - // Error - bool hasError() const; - void addError(Dice::ERROR_CODE code, const QString& msg); - void addWarning(Dice::ERROR_CODE code, const QString& msg); - const QMap& getErrorList() const; - const QMap& getWarningList() const; - - // Traversal functions - static QString number(qreal value); - static ExecutionNode* getLeafNode(ExecutionNode* start); - const std::vector& getStartNodes(); - static void setStartNodes(std::vector* startNodes); - std::pair hasResultOfType(Dice::RESULT_TYPE, ExecutionNode* node, bool notthelast= false) const; - QList scalarResultsFromEachInstruction() const; - std::pair finalScalarResult() const; - QString finalStringResult(std::function colorize, - bool removeUnhighlighted= false) const; - QStringList allFirstResultAsString(bool& hasAlias) const; - QList sumOfDiceResult() const; - QList diceResultFromEachInstruction() const; - bool hasIntegerResultNotInFirst() const; - bool hasDiceResult() const; - bool hasStringResult() const; - - // result - static QString replaceVariableToValue(const QString& source, QStringList values, - QMap& errorMap); - static QString replacePlaceHolderToValue(const QString& source, const QList& list, - bool removeUnhighlighted, - std::function colorize); - static SubtituteInfo readVariableFromString(const QString& source, int& start); - static SubtituteInfo readPlaceHolderFromString(const QString& source, int& start); - static ExportedDiceResult finalDiceResultFromInstruction(ExecutionNode* start); - static ExportedDiceResult allDiceResultFromInstruction(ExecutionNode* start); - void addResultInJson(QJsonObject& obj, Dice::RESULT_TYPE type, const QString& key, ExecutionNode* start, bool b); - void addDiceResultInJson(QJsonObject& obj, ExecutionNode* start, - std::function colorize); - - // accessors - void setComment(const QString& comment); - QString getComment() const; - void setHelpPath(const QString& path); - static QHash getVariableHash(); - static void setVariableHash(const QHash& variableHash); - void setStartNodes(std::vector nodes); - - // Aliases - QString convertAlias(QString str); - void insertAlias(DiceAlias* dice, int i); - const QList& getAliases() const; - QList* aliases(); - void setAliases(const QList list); - void cleanUpAliases(); - - static bool readStringResultParameter(QString& str); - static QString replacePlaceHolderFromJson(const QString& source, const QJsonObject& obj); - -private: - QMap m_logicOp; - QMap m_logicOperation; - QMap m_conditionOperation; - std::vector> m_arithmeticOperation; - QMap m_mapDiceOp; - QMap m_OptionOp; - QMap m_nodeActionMap; - std::map m_functionMap; - QStringList m_commandList; - - QMap m_errorMap; - QMap m_warningMap; - std::vector m_startNodes; - - QString m_comment; - - static QHash m_variableHash; - QString m_helpPath; - QList m_aliasList; -}; - -#endif // PARSINGTOOLBOX_H -- cgit v1.2.3-70-g09d2