QtNovelUI/DesParser/SyntaxBase.h

400 lines
9.6 KiB
C
Raw Normal View History

2022-11-06 00:37:50 +00:00
#pragma once
#include <QString>
#include <functional>
#include <QList>
2022-11-15 08:07:02 +00:00
#include <QHash>
#include <QFileInfo>
2022-11-06 11:40:11 +00:00
#include "LexFoundation.h"
2022-11-15 08:07:02 +00:00
#include "ComnDef.h"
2022-11-06 00:37:50 +00:00
namespace Parse
{
2022-11-06 11:40:11 +00:00
namespace Result {
2022-11-15 08:07:02 +00:00
class ParseCore;
2022-11-06 11:40:11 +00:00
class DesNode;
class NamedNode;
class DocCore;
}
namespace Result
{
/**
* .
*/
class Words
{
public:
explicit Words(Result::DesNode* host, Result::DocCore *doc, const QString &value, int row, int col);
virtual ~Words() = default;
/**
* .
*
* \return
*/
virtual int row() const;
/**
* .
*
* \return
*/
virtual int column() const;
/**
* .
*
* \return
*/
virtual int length() const;
/**
* nullptr.
*
* \return
*/
virtual Result::DesNode* host() const;
/**
* .
*
* \return
*/
virtual Result::DocCore* doc() const;
/**
* .
*
* \return
*/
virtual QString toString() const;
private:
QString value_store;
int row_store, col_store;
Result::DesNode *desnode_store;
Result::DocCore *docpresent_store;
};
/**
* .
*/
class DesNode
{
public:
2022-11-15 08:07:02 +00:00
DesNode(DocCore *core, int type_value, DesNode *pnode = nullptr);
virtual ~DesNode();
2022-11-06 11:40:11 +00:00
/**
* 0
*
* \return
*/
2022-11-15 08:07:02 +00:00
int depth() const;
2022-11-06 11:40:11 +00:00
/**
* .
*
* \return
*/
2022-11-15 08:07:02 +00:00
DocCore* doc() const;
2022-11-06 11:40:11 +00:00
/**
* .
*
* \return
*/
2022-11-15 08:07:02 +00:00
int typeValue() const;
2022-11-06 11:40:11 +00:00
/**
* .
*
* \return
*/
2022-11-15 08:07:02 +00:00
DesNode* parent() const;
2022-11-06 11:40:11 +00:00
/**
*
*
* \param ins
*/
2022-11-15 08:07:02 +00:00
void appendChild(DesNode *ins);
2022-11-06 11:40:11 +00:00
/**
*
*
* \return
*/
2022-11-15 08:07:02 +00:00
QList<DesNode*> children() const;
/**
* @brief
* @param ins
*/
void registerWords(Words *ins);
/**
* @brief
* @return
*/
QList<Words*> refered() const;
2022-11-06 11:40:11 +00:00
/**
* .
*
* \return true
*/
virtual bool check(QList<QString> &reasons) const = 0;
/**
* .
*
* \return
*/
virtual QString toString() const = 0;
2022-11-15 08:07:02 +00:00
private:
DocCore *const doc_store;
int type_value;
DesNode *const parent_node;
QList<DesNode*> children_nodes;
QList<Words*> words_collection;
2022-11-06 11:40:11 +00:00
};
/**
* .
*/
class NamedNode : public Result::DesNode
{
public:
2022-11-15 08:07:02 +00:00
NamedNode(const QString &name, DocCore *core, int type, DesNode *pnode = nullptr);
2022-11-06 11:40:11 +00:00
virtual ~NamedNode() = default;
/**
* .
*
* \return
*/
2022-11-15 08:07:02 +00:00
QString name() const;
private:
QString name_store;
2022-11-06 11:40:11 +00:00
};
2022-11-15 08:07:02 +00:00
enum class DocType
{
STORYBOARD = DOC_STORYBOARD,
STORYUNIT = DOC_STORYUNIT,
STORYCHAIN = DOC_STORYCHAIN,
STORYOUTLINES = DOC_VOLUMEOUTLINE
};
2022-11-06 11:40:11 +00:00
/**
2022-11-15 08:07:02 +00:00
* .
2022-11-06 11:40:11 +00:00
*/
class DocCore
{
public:
2022-11-15 08:07:02 +00:00
explicit DocCore(ParseCore* core, DocType type, const QFileInfo &path);
2022-11-06 11:40:11 +00:00
virtual ~DocCore() = default;
/**
* .
*
* \return
*/
Result::DesNode* unknowns() const;
/**
* .
*
* \return
*/
2022-11-15 08:07:02 +00:00
ParseCore* core() const;
2022-11-06 11:40:11 +00:00
/**
2022-11-15 08:07:02 +00:00
* @brief
* @return
2022-11-06 11:40:11 +00:00
*/
2022-11-15 08:07:02 +00:00
DocType docType() const;
2022-11-06 11:40:11 +00:00
/**
* .
*
* \return
*/
QString filePath() const;
/**
* .
*
* \return
*/
QString fileName() const;
/**
* .
*/
void clear();
/**
* .
*
* \param ins
* \return 0 -
*/
int append(Words *ins);
/**
* .
*
* \param row
* \param col
* \return
*/
Words* getWords(int row, int col) const;
private:
Result::DesNode *const unknown_host;
2022-11-15 08:07:02 +00:00
ParseCore *const core_store;
2022-11-06 11:40:11 +00:00
QString file_path_store;
2022-11-15 08:07:02 +00:00
DocType type_store;
QList<Words*> words_store;
2022-11-06 11:40:11 +00:00
};
/**
2022-11-15 08:07:02 +00:00
* .
2022-11-06 11:40:11 +00:00
*/
2022-11-15 08:07:02 +00:00
class ParseCore
2022-11-06 11:40:11 +00:00
{
private:
QString name_store;
2022-11-15 08:07:02 +00:00
QHash<DocCore*, QList<DesNode*>*> nodes_map;
2022-11-06 11:40:11 +00:00
public:
2022-11-15 08:07:02 +00:00
explicit ParseCore(const QString &name);
virtual ~ParseCore() = default;
virtual void registerNode(DocCore *doc, DesNode *node);
virtual void clearNodes(DocCore *ins);
virtual QList<DocCore *> allDocuments() const;
virtual QList<DesNode*> queryRootNodes(DocCore *doc) const;
2022-11-06 11:40:11 +00:00
/**
2022-11-15 08:07:02 +00:00
* nullptr.
2022-11-06 11:40:11 +00:00
*
* \param file_path
* \return
*/
2022-11-15 08:07:02 +00:00
virtual Result::DocCore* queryDocument(const QFileInfo &file_src) const;
virtual void deleteDocument(Result::DocCore *ins);
2022-11-06 11:40:11 +00:00
2022-11-15 08:07:02 +00:00
virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const;
virtual QList<Result::DesNode*> queryStoryPoint(Result::DesNode* chain, const QString &name) const;
2022-11-06 11:40:11 +00:00
2022-11-15 08:07:02 +00:00
virtual QList<Result::DesNode*> queryStoryUnit(const QString &name) const;
virtual QList<Result::DesNode*> queryStoryFragment(Result::DesNode *unit, const QString &name) const;
virtual QList<Result::DesNode*> queryStoryBoard(const QString &name) const;
2022-11-06 11:40:11 +00:00
/**
2022-11-15 08:07:02 +00:00
* @brief
* @param name
* @return
2022-11-06 11:40:11 +00:00
*/
2022-11-15 08:07:02 +00:00
virtual QList<Result::DesNode*> queryStoryDepiction(const QString &name) const;
2022-11-06 11:40:11 +00:00
};
}
}
namespace Syntax {
/**
* .
*/
enum class ParseResult
{
SelfManipulate = 1,
EnterNext = 2,
Completed = 3,
Failed = 4,
};
/**
* .
*/
class SyntaxParser
{
public:
virtual ~SyntaxParser() = default;
/**
* Doc实例.
*
* \param ins
*/
virtual void docActive(Parse::Result::DocCore *ins) = 0;
/**
* .
*
* \return
*/
virtual Parse::Result::DocCore* docRef() const = 0;
/**
* .
*
* \param seqs
* \return
*/
virtual bool applied(const QList<Lex::LexResult>& seqs) = 0;
/**
*
*/
virtual void reset() = 0;
/**
* Token序列
*
* \param seqs
* \param next_ps
* \return
*/
virtual ParseResult parse(QList<Lex::LexResult>& seqs)= 0;
/**
* .
*
* \return
*/
virtual QList<SyntaxParser*> children() const = 0;
/**
* .
*
* \return
*/
virtual Parse::Result::DesNode* currNode() const = 0;
2022-11-15 08:07:02 +00:00
protected:
2022-11-06 11:40:11 +00:00
/**
* .
*
* \param parsers
*/
virtual void addChild(QList<SyntaxParser*> parsers) = 0;
};
2022-11-06 00:37:50 +00:00
}